hive 常用運算
第一部分:關系運算
hive支援的關系運算符
•常見的關系運算符
•等值比較: =
•不等值比較: <>
•小于比較: <
•小于等于比較: <=
•大于比較: >
•大于等于比較: >=
•空值判斷: is null
•非空判斷: is not null
•like比較: like
•java的like操作: rlike
•regexp操作: regexp
文法:a=b
操作類型:所有基本類型
描述: 如果表達式a與表達式b相等,則為true;否則為false
舉例:
hive> select 1 from dual where 1=1;
文法: a <> b
操作類型: 所有基本類型
描述: 如果表達式a為null,或者表達式b為null,傳回null;如果表達式a與表達式b不相等,則為true;否則為false
hive> select 1 from dual where 1<> 2;
文法: a < b
描述: 如果表達式a為null,或者表達式b為null,傳回null;如果表達式a小于表達式b,則為true;否則為false
hive> select 1 from dual where 1 < 2;
文法: a <= b
描述: 如果表達式a為null,或者表達式b為null,傳回null;如果表達式a小于或者等于表達式b,則為true;否則為false
hive> select 1 from dual where 1 <=1;
文法: a >= b
描述: 如果表達式a為null,或者表達式b為null,傳回null;如果表達式a大于或者等于表達式b,則為true;否則為false
hive> select 1 from dual where 1 >=1;
文法: a is null
操作類型: 所有類型
描述: 如果表達式a的值為null,則為true;否則為false
hive> select 1 from dual where null isnull;
文法: a is not null
描述: 如果表達式a的值為null,則為false;否則為true
hive> select 1 from dual where 1 is notnull;
文法: a like b
操作類型: strings
描述: 如果字元串a或者字元串b為null,則傳回null;如果字元串a符合表達式b 的正則文法,則為true;否則為false。b中字元”_”表示任意單個字元,而字元”%”表示任意數量的字元。
hive> select 1 from dual where ‘key' like 'foot%';
1
hive> select 1 from dual where ‘key ' like 'foot____';
注意:否定比較時候用 not a like b
hive> select 1 from dual where not ‘key ' like 'fff%';
文法: a rlike b
描述: 如果字元串a或者字元串b為null,則傳回null;如果字元串a符合java正規表達式b的正則文法,則為true;否則為false。
hive> select 1 from dual where 'footbar’ rlike '^f.*r$’;
注意:判斷一個字元串是否全為數字:
hive>select 1 from dual where '123456'rlike '^\\d+$';
hive> select 1 from dual where'123456aa' rlike '^\\d+$';
文法: a regexp b
描述: 功能與rlike相同
hive> select 1 from dual where ‘key' regexp '^f.*r$';
第二部分:邏輯運算與數學運算
hive數學運算
•加法操作: +
•減法操作: -
•乘法操作: *
•除法操作: /
•取餘操作: %
•位與操作: &
•位或操作: |
•位異或操作: ^
•位取反操作: ~
文法: a + b
操作類型:所有數值類型
說明:傳回a與b相加的結果。結果的數值類型等于a的類型和b的類型的最小父類型(詳見資料類型的繼承關系)。比如,int + int 一般結果為int類型,而int + double 一般結果為double類型
hive> select 1 + 9 from dual;
10
文法: a – b
說明:傳回a與b相減的結果。結果的數值類型等于a的類型和b的類型的最小父類型(詳見資料類型的繼承關系)。比如,int – int 一般結果為int類型,而int – double 一般結果為double類型
hive> select 10 – 5 from dual;
5
• 乘法操作 : *
文法: a * b
說明:傳回a與b相乘的結果。結果的數值類型等于a的類型和b的類型的最小父類型(詳見資料類型的繼承關系)。注意,如果a乘以b的結果超過預設結果類型的數值範圍,則需要通過cast将結果轉換成範圍更大的數值類型
hive> select 40 * 5 from dual;
200
• 除法操作 : /
文法: a / b
說明:傳回a除以b的結果。結果的數值類型為double
hive> select 40 / 5 from dual;
8.0
注意: hive 中最高精度的資料類型是 double, 隻精确到小數點後 16 位,在做除法運算的時候要特别注意
hive>selectceil(28.0/6.999999999999999999999) from dual limit 1;
結果為4
hive>select ceil(28.0/6.99999999999999)from dual limit 1;
結果為5
• 取餘操作 : %
文法: a % b
說明:傳回a除以b的餘數。結果的數值類型等于a的類型和b的類型的最小父類型(詳見資料類型的繼承關系)。
hive> select 41 % 5 from dual;
hive> select 8.4 % 4 from dual;
0.40000000000000036
注意:精度在 hive 中是個很大的問題,類似這樣的操作最好通過 round 指定精度
hive> select round(8.4 % 4 , 2) fromdual;
0.4
• 位與操作 : &
文法: a & b
說明:傳回a和b按位進行與操作的結果。結果的數值類型等于a的類型和b的類型的最小父類型(詳見資料類型的繼承關系)。
hive> select 4 & 8 from dual;
hive> select 6 & 4 from dual;
4
• 位或操作 : |
文法: a | b
說明:傳回a和b按位進行或操作的結果。結果的數值類型等于a的類型和b的類型的最小父類型(詳見資料類型的繼承關系)。
hive> select 4 | 8 from dual;
12
hive> select 6 | 8 from dual;
14
• 位異或操作 : ^
文法: a ^ b
說明:傳回a和b按位進行異或操作的結果。結果的數值類型等于a的類型和b的類型的最小父類型(詳見資料類型的繼承關系)。
hive> select 4 ^ 8 from dual;
hive> select 6 ^ 4 from dual;
2
• 位取反操作 : ~
文法: ~a
說明:傳回a按位取反操作的結果。結果的數值類型等于a的類型。
hive> select ~6 from dual;
-7
hive> select ~4 from dual;
-5
hive邏輯運算
•邏輯與操作: and
•邏輯或操作: or
•邏輯非操作: not
• 邏輯與操作 : and
文法: a and b
操作類型:boolean
說明:如果a和b均為true,則為true;否則為false。如果a為null或b為null,則為null
hive> select 1 from dual where 1=1 and2=2;
• 邏輯或操作 : or
文法: a or b
說明:如果a為true,或者b為true,或者a和b均為true,則為true;否則為false
hive> select 1 from dual where 1=2 or2=2;
• 邏輯非操作 : not
文法: not a
說明:如果a為false,或者a為null,則為true;否則為false
hive> select 1 from dual where not 1=2;
hive> select 1 from dual where not 1=2 ;
第三部分:數值運算
•取整函數: round
•指定精度取整函數: round
•向下取整函數: floor
•向上取整函數: ceil
•向上取整函數: ceiling
•取随機數函數: rand
•自然指數函數: exp
•以10為底對數函數: log10
•以2為底對數函數: log2
• 對數函數: log
•幂運算函數: pow
•幂運算函數: power
•開平方函數: sqrt
•二進制函數: bin
•十六進制函數: hex
•反轉十六進制函數: unhex
•進制轉換函數: conv
•絕對值函數: abs
•正取餘函數: pmod
•正弦函數: sin
•反正弦函數: asin
•餘弦函數: cos
•反餘弦函數: acos
•positive函數: positive
•negative函數: negative
• 取整函數 : round
文法: round(double a)
傳回值: bigint
說明: 傳回double類型的整數值部分 (遵循四舍五入)
hive> select round(3.1415926) from dual;
3
hive> select round(3.5) from dual;
hive> create table dual as selectround(9542.158) from dual;
hive> describe dual;
_c0 bigint
• 指定精度取整函數 : round
文法: round(double a, intd)
傳回值: double
說明: 傳回指定精度d的double類型
hive> select round(3.1415926,4) fromdual;
3.1416
• 向下取整函數 : floor
文法: floor(double a)
說明: 傳回等于或者小于該double變量的最大的整數
hive> select floor(3.1415926) from dual;
hive> select floor(25) from dual;
25
• 向上取整函數 : ceil
文法: ceil(double a)
說明: 傳回等于或者大于該double變量的最小的整數
hive> select ceil(3.1415926) from dual;
hive> select ceil(46) from dual;
46
• 向上取整函數 : ceiling
文法: ceiling(double a)
說明: 與ceil功能相同
hive> select ceiling(3.1415926) fromdual;
hive> select ceiling(46) from dual;
• 取随機數函數 : rand
文法: rand(),rand(intseed)
說明: 傳回一個0到1範圍内的随機數。如果指定種子seed,則會等到一個穩定的随機數序列
hive> select rand() from dual;
0.5577432776034763
• 自然指數函數 : exp
文法: exp(double a)
說明: 傳回自然對數e的a次方
hive> select exp(2) from dual;
7.38905609893065
自然對數函數: ln
文法: ln(double a)
說明: 傳回a的自然對數
• 以 10 為底對數函數 : log10
文法: log10(double a)
說明: 傳回以10為底的a的對數
hive> select log10(100) from dual;
• 以 2 為底對數函數 : log2
文法: log2(double a)
說明: 傳回以2為底的a的對數
hive> select log2(8) from dual;
• 對數函數 : log
文法: log(double base,double a)
說明: 傳回以base為底的a的對數
hive> select log(4,256) from dual;
• 幂運算函數 : pow
文法: pow(double a, doublep)
說明: 傳回a的p次幂
hive> select pow(2,4) from dual;
16.0
• 幂運算函數 : power
文法: power(double a,double p)
說明: 傳回a的p次幂,與pow功能相同
hive> select power(2,4) from dual;
• 開平方函數 : sqrt
文法: sqrt(double a)
說明: 傳回a的平方根
hive> select sqrt(16) from dual;
• 二進制函數 : bin
文法: bin(bigint a)
傳回值: string
說明: 傳回a的二進制代碼表示
hive> select bin(7) from dual;
111
• 十六進制函數 : hex
文法: hex(bigint a)
說明: 如果變量是int類型,那麼傳回a的十六進制表示;如果變量是string類型,則傳回該字元串的十六進制表示
hive> select hex(17) from dual;
11
hive> select hex(‘abc’) from dual;
616263
• 反轉十六進制函數 : unhex
文法: unhex(string a)
說明: 傳回該十六進制字元串所代碼的字元串
hive> select unhex(‘616263’) from dual;
abc
hive> select unhex(‘11’) from dual;
-
hive> select unhex(616263) from dual;
• 進制轉換函數 : conv
文法: conv(bigint num, intfrom_base, int to_base)
說明: 将數值num從from_base進制轉化到to_base進制
hive> select conv(17,10,16) from dual;
hive> select conv(17,10,2) from dual;
10001
• 絕對值函數 : abs
文法: abs(double a) abs(int a)
傳回值: double int
說明: 傳回數值a的絕對值
hive> select abs(-3.9) from dual;
3.9
hive> select abs(10.9) from dual;
10.9
• 正取餘函數 : pmod
文法: pmod(int a, intb),pmod(double a, double b)
傳回值: int double
說明: 傳回正的a除以b的餘數
hive> select pmod(9,4) from dual;
hive> select pmod(-9,4) from dual;
• 正弦函數 : sin
文法: sin(double a)
說明: 傳回a的正弦值
hive> select sin(0.8) from dual;
0.7173560908995228
• 反正弦函數 : asin
文法: asin(double a)
說明: 傳回a的反正弦值
hive> select asin(0.7173560908995228)from dual;
0.8
• 餘弦函數 : cos
文法: cos(double a)
說明: 傳回a的餘弦值
hive> select cos(0.9) from dual;
0.6216099682706644
• 反餘弦函數 : acos
文法: acos(double a)
說明: 傳回a的反餘弦值
hive> select acos(0.6216099682706644)from dual;
0.9
• positive 函數 : positive
文法: positive(int a),positive(double a)
說明: 傳回a
hive> select positive(-10) from dual;
-10
hive> select positive(12) from dual;
• negative 函數 : negative
文法: negative(int a),negative(double a)
說明: 傳回-a
hive> select negative(-5) from dual;
hive> select negative(8) from dual;
-8
第四部分:日期函數
•unix時間戳轉日期函數: from_unixtime
• 擷取目前unix時間戳函數: unix_timestamp
•日期轉unix時間戳函數: unix_timestamp
• 指定格式日期轉unix時間戳函數: unix_timestamp
•日期時間轉日期函數: to_date
•日期轉年函數: year
• 日期轉月函數: month
• 日期轉天函數: day
• 日期轉小時函數: hour
• 日期轉分鐘函數: minute
• 日期轉秒函數: second
• 日期轉周函數:weekofyear
• 日期比較函數: datediff
• 日期增加函數: date_add
• 日期減少函數: date_sub
• unix 時間戳轉日期函數 : from_unixtime
文法: from_unixtime(bigintunixtime[, string format])
說明: 轉化unix時間戳(從1970-01-01 00:00:00utc到指定時間的秒數)到目前時區的時間格式
hive> selectfrom_unixtime(1323308943,'yyyymmdd') from dual;
20111208
• 擷取目前 unix 時間戳函數 : unix_timestamp
文法: unix_timestamp()
說明: 獲得目前時區的unix時間戳
hive> select unix_timestamp() from dual;
1323309615
• 日期轉 unix 時間戳函數 : unix_timestamp
文法:unix_timestamp(string date)
說明: 轉換格式為"yyyy-mm-dd hh:mm:ss"的日期到unix時間戳。如果轉化失敗,則傳回0。
hive> select unix_timestamp('2011-12-0713:01:03') from dual;
1323234063
• 指定格式日期轉 unix 時間戳函數 : unix_timestamp
文法:unix_timestamp(string date, string pattern)
說明: 轉換pattern格式的日期到unix時間戳。如果轉化失敗,則傳回0。
hive> select unix_timestamp('2011120713:01:03','yyyymmdd hh:mm:ss') from dual;
• 日期時間轉日期函數 :to_date
文法: to_date(stringtimestamp)
說明: 傳回日期時間字段中的日期部分。
hive> select to_date('2011-12-0810:03:01') from dual;
2011-12-08
• 日期轉年函數 : year
文法: year(string date)
傳回值: int
說明: 傳回日期中的年。
hive> select year('2011-12-08 10:03:01')from dual;
2011
hive> select year('2012-12-08') fromdual;
2012
• 日期轉月函數 : month
文法: month (string date)
說明: 傳回日期中的月份。
hive> select month('2011-12-0810:03:01') from dual;
hive> select month('2011-08-08') fromdual;
• 日期轉天函數 : day
文法: day (string date)
說明: 傳回日期中的天。
hive> select day('2011-12-08 10:03:01')from dual;
hive> select day('2011-12-24') fromdual;
24
• 日期轉小時函數 : hour
文法: hour (string date)
說明: 傳回日期中的小時。
hive> select hour('2011-12-08 10:03:01')from dual;
• 日期轉分鐘函數 : minute
文法: minute (string date)
說明: 傳回日期中的分鐘。
hive> select minute('2011-12-0810:03:01') from dual;
• 日期轉秒函數 : second
文法: second (string date)
說明: 傳回日期中的秒。
hive> select second('2011-12-08 10:03:01')from dual;
• 日期轉周函數 :weekofyear
文法: weekofyear (stringdate)
說明: 傳回日期在目前的周數。
hive> select weekofyear('2011-12-0810:03:01') from dual;
49
• 日期比較函數 :datediff
文法: datediff(stringenddate, string startdate)
說明: 傳回結束日期減去開始日期的天數。
hive> selectdatediff('2012-12-08','2012-05-09') from dual;
213
• 日期增加函數 :date_add
文法: date_add(stringstartdate, int days)
說明: 傳回開始日期startdate增加days天後的日期。
hive> select date_add('2012-12-08',10)from dual;
2012-12-18
• 日期減少函數 :date_sub
文法: date_sub (stringstartdate, int days)
說明: 傳回開始日期startdate減少days天後的日期。
hive> select date_sub('2012-12-08',10)from dual;
2012-11-28
第五部分:條件函數
•if函數: if
•非空查找函數: coalesce
•條件判斷函數:case
• if 函數 : if
文法: if(booleantestcondition, t valuetrue, t valuefalseornull)
傳回值: t
說明: 當條件testcondition為true時,傳回valuetrue;否則傳回valuefalseornull
hive> select if(1=2,100,200) from dual;
hive> select if(1=1,100,200) from dual;
100
• 非空查找函數 :coalesce
文法: coalesce(t v1, t v2,…)
說明: 傳回參數中的第一個非空值;如果所有值都為null,那麼傳回null
hive> select coalesce(null,'100','50′) from dual;
條件判斷函數: case
文法 : case a when b thenc [when d then e]* [else f] end
傳回值 : t
說明:如果 a 等于 b ,那麼傳回 c ;如果 a 等于 d ,那麼傳回 e ;否則傳回 f
hive> select case 100 when 50 then 'tom'when 100 then 'mary' else 'tim' end from dual;
mary
第六部分:字元串函數
•字元串長度函數:length
•字元串反轉函數:reverse
•字元串連接配接函數:concat
• 帶分隔符字元串連接配接函數:concat_ws
• 字元串截取函數:substr,substring
• 字元串轉大寫函數:upper,ucase
• 字元串轉小寫函數:lower,lcase
• 去空格函數:trim
• 左邊去空格函數:ltrim
• 右邊去空格函數:rtrim
•正規表達式替換函數:regexp_replace
•正規表達式解析函數:regexp_extract
•url解析函數:parse_url
•json解析函數:get_json_object
•空格字元串函數:space
•重複字元串函數:repeat
•首字元ascii函數:ascii
•左補足函數:lpad
•右補足函數:rpad
•分割字元串函數: split
•集合查找函數: find_in_set
• 字元串長度函數: length
文法: length(string a)
說明:傳回字元串a的長度
hive> select length('abcedfg') fromdual;
7
• 字元串反轉函數: reverse
文法: reverse(string a)
說明:傳回字元串a的反轉結果999999舉例:
hive> select reverse(abcedfg’) from dual;
gfdecba