一、hive函數
1、關係函數
2、日期函數
3、條件函數
4、字符串函數
5、統計函數
二、hiveQL
1、DDL
2、DML
三、其它
1、in()函數
2、lateral view 函數
3、row_number() 和rank()
4、grouping sets()函數
一、hive函數
1、關係函數
等值比較: =
語法:A=B。如果表達式A與表達式B相等,則為TRUE;否則為FALSE
不等值比較: <>
語法: A <> B。如果表達式A為NULL,或者表達式B為NULL,返回NULL;如果表達式A與表達式B不相等,則為TRUE;否則為FALSE
小於比較: <
語法: A < B。 如果表達式A為NULL,或者表達式B為NULL,返回NULL;如果表達式A小於表達式B,則為TRUE;否則為FALSE
小於等於比較: <=
語法: A <= B。如果表達式A為NULL,或者表達式B為NULL,返回NULL;如果表達式A小於或者等於表達式B,則為TRUE;否則為FALSE
大於等於比較: >=
語法: A >= B。如果表達式A為NULL,或者表達式B為NULL,返回NULL;如果表達式A大於或者等於表達式B,則為TRUE;否則為FALSE
空值判斷: IS NULL
語法: A IS NULL。如果表達式A的值為NULL,則為TRUE;否則為FALSE
非空判斷: IS NOT NULL
語法: A IS NOT NULL。 如果表達式A的值為NULL,則為FALSE;否則為TRUE
LIKE比較: LIKE
語法: A[NOT] LIKE B。如果字符串A或者字符串B為NULL,則返回NULL;如果字符串A符合表達式B的正則語法,則為TRUE;否則為FALSE。B中字符」_」表示任意單個字符,而字符」%」表示任意數量的字符。
舉例:
select * from dw.topic_order where partition_pay_date = '2016-04-22' and client_type like 『ip%』 ##能夠匹配以ip開頭的所有字符串
注意:對特殊字符進行轉譯時,注意要使用兩個反斜槓\。
JAVA的LIKE/REGEXP操作: RLIKE/REGEXP
語法: A RLIKE/REGEXP B。如果字符串A或者字符串B為NULL,則返回NULL;如果字符串A符合JAVA正則表達式B的正則語法,則為TRUE;否則為FALSE
舉例:select * from dw.topic_order where partition_pay_date = '2016-04-22' and client_type rlike/regexp '^android.*'
注意:通配符『%』在rlike/regexp函數中,只能匹配一個'%'字符,』_『也只能匹配一個』_『字符。例如:
select * from dw.topic_order where partition_pay_date = '2016-04-22' and client_type regexp 'ip%' ##只能匹配ip%這個字符串
2、日期函數
UNIX時間戳轉日期函數: from_unixtime
語法: from_unixtime(bigint unixtime[, string format])。轉化UNIX時間戳(從1970-01-01 00:00:00 UTC到指定時間的秒數)到當前時區的時間格式
舉例:select from_unixtime(1323308943,'yyyyMMdd') from dual; ##返回值為20111208
獲取當前UNIX時間戳函數: unix_timestamp
語法: unix_timestamp()。獲得當前時區的UNIX時間戳
舉例:select unix_timestamp() from dual; ##返回值為1323309615
日期轉UNIX時間戳函數: unix_timestamp
語法: unix_timestamp(string date)。轉換格式為"yyyy-MM-dd HH:mm:ss"的日期到UNIX時間戳。如果轉化失敗,則返回0。
舉例:select unix_timestamp('2011-12-07 13:01:03') from dual; ##返回值為1323234063
指定格式日期轉UNIX時間戳函數: unix_timestamp
語法: unix_timestamp(string date, string pattern)。轉換pattern格式的日期到UNIX時間戳。如果轉化失敗,則返回0。
舉例:select unix_timestamp('20111207 13:01:03','yyyyMMdd HH:mm:ss') from dual; ##返回值為1323234063
日期時間轉日期函數: to_date
語法: to_date(string timestamp)。返回日期時間欄位中的日期部分。
舉例:select to_date('2011-12-08 10:03:01') from dual; ##返回值為2011-12-08
日期轉年函數: year
語法: year(string date)。 返回日期中的年。
日期轉月函數: month
語法: month (string date)。返回日期中的月份。
日期轉天函數: day
語法: day (string date)。返回日期中的天。
日期轉小時函數: hour
語法: hour (string date)。 返回日期中的小時。
日期轉分鐘函數: minute
語法: minute (string date)。返回日期中的分鐘。
舉例:select minute('2011-12-08 10:03:01') from dual; ##返回值為3
日期轉秒函數: second
語法: second (string date)。 返回日期中的秒。
舉例:select second('2011-12-08 10:03:01') from dual; ##返回值為1
日期轉周函數: weekofyear
語法: weekofyear (string date)。返回日期在當前的周數。
舉例:select weekofyear('2011-12-08 10:03:01') from dual; ##返回值為49
日期比較函數: datediff
語法: datediff(string enddate, string startdate)。返回結束日期減去開始日期的天數。
舉例: select datediff('2012-12-08','2012-05-09') from dual; ##返回值為213
日期增加函數: date_add
語法: date_add(string startdate, int days)。 返回開始日期startdate增加days天后的日期。
舉例:select date_add('2012-12-08',10) from dual; ##返回值為2012-12-18
日期減少函數: date_sub
語法: date_sub (string startdate, int days)。 返回開始日期startdate減少days天后的日期。
舉例:select date_sub('2012-12-08',10) from dual; ##返回值為2012-11-28
註:幾個日期函數在MySQL和Hive裡的區別
Hive: SELECT FROM_UNIXTIME( 1249488000, '%Y%m%d') 結果為 %2009%0%6Hive: SELECT FROM_UNIXTIME( 1249488000, 'yyyy-MM-dd') 結果為 2009-08-06MySQL:SELECT FROM_UNIXTIME( 1249488000, '%Y%m%d') 結果為 20090806MySQL:SELECT FROM_UNIXTIME( 1249488000, '%Y-%m-%d') 結果為 2009-08-06
3、條件函數
If 函數: if
語法: if(boolean testCondition, T valueTrue, T valueFalseOrNull)
說明: 當條件testCondition為TRUE時,返回valueTrue;否則返回valueFalseOrNull
舉例:select if(app_name = 'group',object_id,null) as deal_id from dw.topic_order where partition_pay_date = '2016-04-22'
非空查找函數: COALESCE
語法: COALESCE(T v1, T v2, …)
說明: 返回參數中的第一個非空值;如果所有值都為NULL,那麼返回NULL
舉例:select coalesce(uuid,'') as uuid from dw.topic_order where partition_pay_date = '2016-04-22'
條件判斷函數:CASE
語法 : CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END
說明:如果 a 等於 b ,那麼返回 c ;如果 a 等於 d ,那麼返回 e ;否則返回 f
舉例:
select object_id,user_id,uuid, case when client_type like 'ip%' then 'ios' when client_type like 'andr%' then 'android' else 'other' end as utm_medium from dw.topic_order where partition_pay_date = '2016-04-22'
注意:相對而言,case when是最全的條件函數,可以用於判斷多種條件;次之是if函數,屬於二分判斷;最後是coalesce函數,該函數只能對空值和非空進行判斷。
4、字符串函數
字符串長度函數:length
語法: length(string A)。返回字符串A的長度
字符串反轉函數:reverse
語法: reverse(string A)。返回字符串A的反轉結果
舉例:select reverse(abcedfg』) from dual; ##返回值為gfdecba
字符串連接函數:concat
語法: concat(string A, string B…)。返回輸入字符串連接後的結果,支持任意個輸入字符串
舉例:select count(distinct if(partition_is_paid = 1,null,concat(coalesce(uuid,''),coalesce(deal_id,'')))) as order_cnt from dw.topic_order where partition_pay_date = '2016-04-22'
帶分隔符字符串連接函數:concat_ws
語法: concat_ws(string SEP, string A, string B…)。返回輸入字符串連接後的結果,SEP表示各個字符串間的分隔符
舉例:select concat_ws(',','abc','def','gh') from dual; ##返回值為abc,def,gh
字符串截取函數:substr,substring
語法: substr(string A, int start),substring(string A, int start)。返回字符串A從start位置到結尾的字符串
舉例:select substr('abcde',3) from dual; ##返回值cde
字符串截取函數:substr,substring
語法: substr(string A, int start, int len),substring(string A, int start, int len)。返回字符串A從start位置開始,長度為len的字符串
舉例:select substr('abcde',3,2) from dual; ##返回值為cd
字符串轉大寫函數:upper,ucase
語法: upper(string A) ucase(string A)。返回字符串A的大寫格式
字符串轉小寫函數:lower,lcase
語法: lower(string A) lcase(string A)。返回字符串A的小寫格式
去空格函數:trim
語法: trim(string A)。去除字符串兩邊的空格
舉例:select trim(' abc ') from dual; ##返回值為abc
左邊去空格函數:ltrim
語法: ltrim(string A)。去除字符串左邊的空格
右邊去空格函數:rtrim
語法: rtrim(string A)。去除字符串右邊的空格
正則表達式替換函數:regexp_replace
語法: regexp_replace(string A, string B, string C)。將字符串A中的符合java正則表達式B的部分替換為C。
舉例:select regexp_replace('foobar', 'oo|ar', '') from dual; ##返回值為fb
正則表達式解析函數:regexp_extract
語法: regexp_extract(string subject, string pattern, int index)。將字符串subject按照pattern正則表達式的規則拆分,返回index指定的字符。
舉例:select regexp_extract('foothebar', 'foo(.*?)(bar)', 1) from dual; ##返回值為the
注意:(1)在有些情況下要使用轉義字符,下面的等號要用雙豎線轉義,這是java正則表達式的規則。
(2)index的值不能大於pattern中()的個數。
URL解析函數:parse_url
語法: parse_url(string urlString, string partToExtract [, string keyToExtract])。返回URL中指定的部分。partToExtract的有效值為:HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO.
舉例:select parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST') from dual; ##返回值為facebook.com
json解析函數:get_json_object
語法: get_json_object(string json_string, string path)。解析json的字符串json_string,返回path指定的內容。如果輸入的json字符串無效,那麼返回NULL。
空格字符串函數:space
語法: space(int n)。返回長度為n的字符串
舉例:select length(space(10)) from dual; ##返回值為10
重複字符串函數:repeat
語法: repeat(string str, int n)。返回重複n次後的str字符串
首字符ascii函數:ascii
語法: ascii(string str)。返回字符串str第一個字符的ascii碼
舉例:select ascii('abcde') from dual; ##返回值為97
左補足函數:lpad
語法: lpad(string str, int len, string pad)。將str進行用pad進行左補足到len位
舉例:select lpad('abc',10,'td') from dual; ##返回值為tdtdtdtabc
右補足函數:rpad
語法: rpad(string str, int len, string pad)。將str進行用pad進行右補足到len位
分割字符串函數: split
語法: split(string str, string pat)。按照pat字符串分割str,會返回分割後的字符串數組
舉例:select split('abtcdtef','t') from dual; ##返回值為["ab","cd","ef"]
集合查找函數: find_in_set
語法: find_in_set(string str, string strList)。返回str在strlist第一次出現的位置,strlist是用逗號分割的字符串。如果沒有找該str字符,則返回0
舉例:select find_in_set('ab','ef,ab,de') from dual; ##返回值為2
5、統計函數
個數統計函數: count
語法: count(*), count(expr), count(DISTINCT expr[, expr_.])。count(*)統計檢索出的行的個數,包括NULL值的行;count(expr)返回指定欄位的非空值的個數;count(DISTINCT expr[, expr_.])返回指定欄位的不同的非空值的個數
總和統計函數: sum
語法: sum(col), sum(DISTINCT col)。sum(col)統計結果集中col的相加的結果;sum(DISTINCT col)統計結果中col不同值相加的結果
平均值統計函數: avg
語法: avg(col), avg(DISTINCT col)。avg(col)統計結果集中col的平均值;avg(DISTINCT col)統計結果中col不同值相加的平均值
最小值統計函數: min
語法: min(col)。 統計結果集中col欄位的最小值
最大值統計函數: max
語法: max(col)。統計結果集中col欄位的最大值
中位數函數:precentile語法: percentile(BIGINT col, p)。求準確的第pth個百分位數,p必須介於0和1之間,但是col欄位目前只支持整數,不支持浮點數類型。