1. 程式人生 > 實用技巧 >hive常用函式

hive常用函式

關係運算

等值比較: =

語法:A=B

操作型別:所有基本型別

描述: 如果表示式 A 與表示式 B 相等,則為 TRUE;否則為 FALSE;只要有任意比較項為

NULL,均返回 FALSE;

舉例:

hive> select 1 from test where 1=1;

1

hive> select 1 from test where NULL = NULL;

OK 

等值比較:<=>

語法:A <=> B

操作型別:所有基本型別

描述:如果 A 和 B 都是非 NULL 值,則返回結果和=一樣,如果兩者都為 NULL,返回 TRUE,

如果有一個為 NULL,則返回 FALSE。

舉例:

hive> select 1 from test where NULL <=> NULL;

OK

1

不等值比較: <>和!=

語法: A <> B    A != B

操作型別: 所有基本型別

描述: 如果表示式 A 為 NULL,或者表示式 B 為 NULL,返回 NULL;如果表示式 A 與表

達式 B 不相等,則為 TRUE;否則為 FALSE

舉例:

hive> select 1 from test where 1 <> 2;

1

小於比較: <

語法: A < B

操作型別: 所有基本型別

描述: 如果表示式 A 為 NULL,或者表示式 B 為 NULL,返回 NULL;如果表示式 A 小於

表示式 B,則為 TRUE;否則為 FALSE

舉例:

hive> select 1 from test where 1 < 2;

1

小於等於比較: <=

語法: A <= B

操作型別: 所有基本型別

描述: 如果表示式 A 為 NULL,或者表示式 B 為 NULL,返回 NULL;如果表示式 A 小於

或者等於表示式 B,則為 TRUE;否則為 FALSE

舉例:

hive> select 1 from test where 1 <= 1;

1

大於比較: >

語法: A > B

操作型別: 所有基本型別

描述: 如果表示式 A 為 NULL,或者表示式 B 為 NULL,返回 NULL;如果表示式 A 大於

表示式 B,則為 TRUE;否則為 FALSE

舉例:

hive> select 1 from test where 2 > 1;

1

大於等於比較: >=

語法: A >= B

操作型別: 所有基本型別

描述: 如果表示式 A 為 NULL,或者表示式 B 為 NULL,返回 NULL;如果表示式 A 大於或者等於表示式 B,則為 TRUE;否則為 FALSE

舉例:

hive> select 1 from test where 1 >= 1;

1

注意:String 的比較要注意(常用的時間比較可以先 to_date 之後再比較)

hive> select * from test;

OK

2011111209 00:00:00      2011111209


hive> select a,b,a<b,a>b,a=b from test;

2011111209 00:00:00      2011111209       false    true     false

區間比較

語法: A [NOT] BETWEEN B AND C

操作型別: 所有型別

描述: 如果 A、B、C 有任一個為 NULL,則返回 FALSE. 等價於 B <= A < C.

舉例:

hive> select 1 from test where 1 between 1 and 2;

OK

1

空值判斷: IS NULL

語法: A IS NULL

操作型別: 所有型別

描述: 如果表示式 A 的值為 NULL,則為 TRUE;否則為 FALSE

舉例:

hive> select 1 from test where null is null;

1

非空判斷: IS NOT NULL

語法: A IS NOT NULL

操作型別: 所有型別

描述: 如果表示式 A 的值為 NULL,則為 FALSE;否則為 TRUE

舉例:

hive> select 1 from test where 1 is not null;

1

LIKE 比較: LIKE

語法: A LIKE B

操作型別: strings

描述: 如果字串 A 或者字串 B 為 NULL,則返回 NULL;如果字串 A 符合表示式 B

的正則語法,則為 TRUE;否則為 FALSE。B 中字元”_”表示任意單個字元,而字

符”%”表示任意數量的字元。

舉例:

hive> select 1 from test where 'football' like 'foot%';

1

hive> select 1 from test where 'football' like 'foot____';

1

注意:否定比較時候用 NOT A LIKE B

hive> select 1 from test where NOT 'football' like 'fff%';

1

JAVA 的 LIKE 操作: RLIKE

語法: A RLIKE B

操作型別: strings

描述: 如果字串 A 或者字串 B 為 NULL,則返回 NULL;如果字串 A 符合 JAVA 正

則表示式 B 的正則語法,則為 TRUE;否則為 FALSE。

舉例:

hive> select 1 from test where 'footbar’ rlike '^f.*r$’;

1

注意:判斷一個字串是否全為數字:

hive>select 1 from test where '123456' rlike '^\\d+$';

1

hive> select 1 from test where '123456aa' rlike '^\\d+$';

REGEXP 操作: REGEXP

語法: A REGEXP B

操作型別: strings

描述: 功能與 RLIKE 相同

舉例:

hive> select 1 from test where 'footbar' REGEXP '^f.*r$';

1

數學運算

加法操作: +

 語法: A + B

操作型別:所有數值型別

說明:返回 A 與 B 相加的結果。結果的數值型別等於 A 的型別和 B 的型別的最小父類

型(詳見資料型別的繼承關係)。比如,int + int 一般結果為 int 型別,而 int + double 一般

結果為 double 型別

舉例:

hive> select 1 + 9 from test;

10

hive> create table test as select 1 + 1.2 from test;

hive> describe test;

_c0      double

減法操作: -

語法: A – B

操作型別:所有數值型別

說明:返回 A 與 B 相減的結果。結果的數值型別等於 A 的型別和 B 的型別的最小父類

型(詳見資料型別的繼承關係)。比如,int – int 一般結果為 int 型別,而 int – double 一

般結果為 double 型別

舉例:

hive> select 10 – 5 from test;

5

hive> create table test as select 5.6 – 4 from test;

hive> describe test;

_c0      double

乘法操作: *

語法: A * B

操作型別:所有數值型別

說明:返回 A 與 B 相乘的結果。結果的數值型別等於 A 的型別和 B 的型別的最小父類

型(詳見資料型別的繼承關係)。注意,如果 A 乘以 B 的結果超過預設結果型別的數值範圍,

則需要通過 cast 將結果轉換成範圍更大的數值型別

舉例:

hive> select 40 * 5 from test;

200

除法操作: /

語法: A / B

操作型別:所有數值型別

說明:返回 A 除以 B 的結果。結果的數值型別為 double

舉例:

hive> select 40 / 5 from test;

8.0
 
注意:hive 中最高精度的資料型別是 double,只精確到小數點後 16 位,在做除法運算的時候要特別注意

hive>select ceil(28.0/6.999999999999999999999) from test limit 1;

結果為 4

hive>select ceil(28.0/6.99999999999999) from test limit 1;

結果為 5

取餘操作: %

語法: A % B

操作型別:所有數值型別

說明:返回 A 除以 B 的餘數。結果的數值型別等於 A 的型別和 B 的型別的最小父型別(詳見資料型別的繼承關係)。

舉例:

hive> select 41 % 5 from test;

1

hive> select 8.4 % 4 from test;

0.40000000000000036

注意:精度在 hive 中是個很大的問題,類似這樣的操作最好通過 round 指定精度

hive> select round(8.4 % 4 , 2) from test;

0.4

位與操作: &

語法: A & B

操作型別:所有數值型別

說明:返回 A 和 B 按位進行與操作的結果。結果的數值型別等於 A 的型別和 B 的型別

的最小父型別(詳見資料型別的繼承關係)。

舉例:

hive> select 4 & 8 from test;

0

hive> select 6 & 4 from test;

4

位或操作: |

語法: A | B

操作型別:所有數值型別

說明:返回 A 和 B 按位進行或操作的結果。結果的數值型別等於 A 的型別和 B 的型別

的最小父型別(詳見資料型別的繼承關係)。

舉例:

hive> select 4 | 8 from test;

12

hive> select 6 | 8 from test;

14

位異或操作: ^

語法: A ^ B

操作型別:所有數值型別

說明:返回 A 和 B 按位進行異或操作的結果。結果的數值型別等於 A 的型別和 B 的類

型的最小父型別(詳見資料型別的繼承關係)。

舉例:

hive> select 4 ^ 8 from test;

12

hive> select 6 ^ 4 from test;

2

位取反操作: ~

語法: ~A

操作型別:所有數值型別

說明:返回 A 按位取反操作的結果。結果的數值型別等於 A 的型別。

舉例:

hive> select ~6 from test;

-7

hive> select ~4 from test;

-5

邏輯運算

邏輯與操作: AND 、&&

語法: A AND B

操作型別:boolean

說明:如果 A 和 B 均為 TRUE,則為 TRUE;否則為 FALSE。如果 A 為 NULL 或 B 為 NULL,

則為 NULL

舉例:

hive> select 1 from test where 1=1 and 2=2;

1

邏輯或操作: OR 、||

語法: A OR B

操作型別:boolean

說明:如果 A 為 TRUE,或者 B 為 TRUE,或者 A 和 B 均為 TRUE,則為 TRUE;否則為 FALSE

舉例:

hive> select 1 from test where 1=2 or 2=2;

1

邏輯非操作: NOT、!

語法: NOT A、!A

操作型別:boolean

說明:如果 A 為 FALSE,或者 A 為 NULL,則為 TRUE;否則為 FALSE

舉例:

hive> select 1 from test where not 1=2;

1

hive> select 1 from test where !1=2;

OK

1

複合型別建構函式

map 結構

語法:map(k1,v1,k2,v2,…)

操作型別:map

說明:使用給定的 key-value 對,構造一個 map 資料結構

舉例:

hive> select map('k1','v1','k2','v2') from test;

OK

{"k2":"v2","k1":"v1"}

struct 結構

語法:struct(val1,val2,val3,…)

操作型別:struct

說明:使用給定的表示式,構造一個 struct 資料結構

舉例:

hive> select struct(1,'aaa',FALSE) from test;

OK

{"col1":1,"col2":"aaa","col3":false}

named_struct 結構

語法:named_struct(name1,val1,name2,val2,name3,val3,…)

操作型別:struct

說明:使用給定的表示式,構造一個指定列名的 struct 資料結構

舉例:

hive> select named_struct('a',1,'b','aaa','c',FALSE) from test;

OK

{"a":1,"b":"aaa","c":false}

array 結構

語法:array(val1,val2,val3,…)

操作型別:array

說明:使用給定的表示式,構造一個 array 資料結構

舉例:

hive> select array(1,2,3) from test;

OK

[1,2,3]

create_union 結構

語法:create_union (tag, val1, val2, ...)

操作型別:uniontype

說明:使用給定的 tag 和表示式,構造一個 uniontype 資料結構。tag 表示使用第 tag 個

表示式作為 uniontype 的 value

舉例:

hive> select create_union(0,'ss',array(1,2,3)) from test;

OK

{0:"ss"}

hive> select create_union(1,'ss',array(1,2,3)) from test;

OK

{1:[1,2,3]}

複合型別操作符

獲取 array 中的元素

語法:A[n]

操作型別:所有基礎型別

說明:返回陣列 A 中第 n 個索引的元素值。

舉例:

hive> select array('a','b','c')[1] from test;

OK

b

獲取 map 中的元素

語法:M[key]

操作型別:所有基礎型別

說明:返回 map 結構 M 中 key 對應的 value。

舉例:

hive> select map('k1','v1')['k1'] from test;

OK

v1

獲取 struct 中的元素

語法:S.x

操作型別:所有型別

說明:返回 struct 結構 S 中名為 x 的元素。

舉例:

hive> select named_struct('a',1,'b','aaa','c',FALSE).c from test;

OK

false

數值計算函式

取整函式: round

語法: round(double a)

返回值: BIGINT

說明: 返回 double 型別的整數值部分 (遵循四捨五入)

舉例:

hive> select round(3.1415926) from test;

3

hive> select round(3.5) from test;

4

hive> create table test as select round(9542.158) from test;

hive> describe test;

_c0      bigint

指定精度取整函式: round

語法: round(double a, int d)

返回值: DOUBLE

說明: 返回指定精度 d 的 double 型別

舉例:

hive> select round(3.1415926,4) from test;

3.1416

向下取整函式: floor

語法: floor(double a)

返回值: BIGINT

說明: 返回等於或者小於該 double 變數的最大的整數

舉例:

hive> select floor(3.1415926) from test;

3

hive> select floor(25) from test;

25

向上取整函式: ceil

語法: ceil(double a)

返回值: BIGINT

說明: 返回等於或者大於該 double 變數的最小的整數

舉例:

hive> select ceil(3.1415926) from test;

4

hive> select ceil(46) from test;

46

向上取整函式: ceiling

語法: ceiling(double a)

返回值: BIGINT

說明: 與 ceil 功能相同

舉例:

hive> select ceiling(3.1415926) from test;

4

hive> select ceiling(46) from test;

46

取隨機數函式: rand

語法: rand(),rand(int seed)

返回值: double

說明: 返回一個 0 到 1 範圍內的隨機數。如果指定種子 seed,則會等到一個穩定的隨機

數序列

舉例:

hive> select rand() from test;

0.5577432776034763

hive> select rand() from test;

0.6638336467363424

hive> select rand(100) from test;

0.7220096548596434

hive> select rand(100) from test;

0.7220096548596434

自然指數函式: exp

語法: exp(double a)

返回值: double

說明: 返回自然對數 e 的 a 次方

舉例:

hive> select exp(2) from test;

7.38905609893065

自然對數函式: ln

語法: ln(double a)

返回值: double

說明: 返回 a 的自然對數

舉例:

hive> select ln(7.38905609893065) from test;

2.0

以 10 為底對數函式: log10

語法: log10(double a)

返回值: double

說明: 返回以 10 為底的 a 的對數

舉例:

hive> select log10(100) from test;

2.0

以 2 為底對數函式: log2

語法: log2(double a)

返回值: double

說明: 返回以 2 為底的 a 的對數

舉例:

hive> select log2(8) from test;

3.0

對數函式: log

語法: log(double base, double a)

返回值: double

說明: 返回以 base 為底的 a 的對數

舉例:

hive> select log(4,256) from test;

4.0

冪運算函式: pow

語法: pow(double a, double p)

返回值: double

說明: 返回 a 的 p 次冪

舉例:

hive> select pow(2,4) from test;

16.0

冪運算函式: power

語法: power(double a, double p)

返回值: double

說明: 返回 a 的 p 次冪,與 pow 功能相同

舉例:

hive> select power(2,4) from test;

16.0

開平方函式: sqrt

語法: sqrt(double a)

返回值: double

說明: 返回 a 的平方根

舉例:

hive> select sqrt(16) from test;

4.0

二進位制函式: bin

語法: bin(BIGINT a)

返回值: string

說明: 返回 a 的二進位制程式碼表示

舉例:

hive> select bin(7) from test;

111

十六進位制函式: hex

語法: hex(BIGINT a)

返回值: string

說明: 如果變數是 int 型別,那麼返回 a 的十六進位制表示;如果變數是 string 型別,則

返回該字串的十六進位制表示

舉例:

hive> select hex(17) from test;

11

hive> select hex(‘abc’) from test;

616263

反轉十六進位制函式: unhex

語法: unhex(string a)

返回值: string

說明: 返回該十六進位制字串所程式碼的字串

舉例:

hive> select unhex(‘616263’) from test;

abc

hive> select unhex(‘11’) from test;

-

hive> select unhex(616263) from test;

abc

進位制轉換函式: conv

語法: conv(BIGINT num, int from_base, int to_base)

返回值: string

說明: 將數值 num 從 from_base 進位制轉化到 to_base 進位制

舉例:

hive> select conv(17,10,16) from test;

11

hive> select conv(17,10,2) from test;

10001

絕對值函式: abs

語法: abs(double a)  abs(int a)

返回值: double   int

說明: 返回數值 a 的絕對值

舉例:

hive> select abs(-3.9) from test;

3.9

hive> select abs(10.9) from test;

10.9

正取餘函式: pmod

語法: pmod(int a, int b),pmod(double a, double b)

返回值: int double

說明: 返回正的 a 除以 b 的餘數

舉例:

hive> select pmod(9,4) from test;

1

hive> select pmod(-9,4) from test;

3

正弦函式: sin

語法: sin(double a)

返回值: double

說明: 返回 a 的正弦值

舉例:

hive> select sin(0.8) from test;

0.7173560908995228

反正弦函式: asin

語法: asin(double a)

返回值: double

說明: 返回 a 的反正弦值

舉例:

hive> select asin(0.7173560908995228) from test;

0.8

餘弦函式: cos

語法: cos(double a)

返回值: double

說明: 返回 a 的餘弦值

舉例:

hive> select cos(0.9) from test;

0.6216099682706644

反餘弦函式: acos

語法: acos(double a)

返回值: double

說明: 返回 a 的反餘弦值

舉例:

hive> select acos(0.6216099682706644) from test;

0.9

positive 函式: positive

語法: positive(int a), positive(double a)

返回值: int double

說明: 返回 a

舉例:

hive> select positive(-10) from test;

-10

hive> select positive(12) from test;

12

negative 函式: negative

語法: negative(int a), negative(double a)

返回值: int double

說明: 返回-a

舉例:

hive> select negative(-5) from test;

5

hive> select negative(8) from test;

-8

集合操作函式

map 型別大小:size

語法: size(Map<K.V>)

返回值: int

說明: 返回 map 型別的 size

舉例:

hive> select size(map('k1','v1','k2','v2')) from test;

OK

2

array 型別大小:size

語法: size(Array<T>)

返回值: int

說明: 返回 array 型別的 size

舉例:

hive> select size(array(1,2,3,4,5)) from test;

OK

5

判斷元素陣列是否包含元素:array_contains

語法: array_contains(Array<T>, value)

返回值: boolean

說明: 返回 Array<T>中是否包含元素 value

舉例:

hive> select array_contains(array(1,2,3,4,5),3) from test;

OK

true

獲取 map 中所有 value 集合

語法: map_values(Map<K.V>)

返回值: array<V>

說明: 返回 Map<K.V>中所有 value 的集合

舉例:

hive> select map_values(map('k1','v1','k2','v2')) from test;

OK

["v2","v1"]

獲取 map 中所有 key 集合

語法: map_keys(Map<K.V>)

返回值: array<K>

說明: 返回 Map<K.V>中所有 key 的集合

舉例:

hive> select map_keys(map('k1','v1','k2','v2')) from test;

OK

["k2","k1"]

陣列排序

語法: sort_array(Array<T>)

返回值: array<t>

說明: 對 Array<T>進行升序排序

舉例:

hive> select sort_array(array(5,7,3,6,9)) from test;

OK

[3,5,6,7,9]

型別轉換函式

二進位制轉換:binary

語法: binary(string|binary)

返回值: binary

說明: 將 string 型別轉換為二進位制

舉例:

hive> select binary('test') from test;

OK

test

基礎型別之間強制轉換:cast

語法: cast(expr as <type>)

返回值: <type>

說明: 將 expr 轉換成<type>

舉例:

hive> select cast('1' as DOUBLE) from test;

OK

1.0

日期函式

UNIX 時間戳轉日期函式: from_unixtime

語法: from_unixtime(bigint unixtime[, string format])

返回值: string

說明: 轉化 UNIX 時間戳(從 1970-01-01 00:00:00 UTC 到指定時間的秒數)到當前時區

的時間格式

舉例:

hive> select from_unixtime(1323308943,'yyyyMMdd') from test;

20111208

獲取當前 UNIX 時間戳函式: unix_timestamp

語法: unix_timestamp()

返回值: bigint

說明: 獲得當前時區的 UNIX 時間戳

舉例:

hive> select unix_timestamp() from test;

1323309615

日期轉 UNIX 時間戳函式: unix_timestamp

語法: unix_timestamp(string date)

返回值: bigint

說明: 轉換格式為"yyyy-MM-dd HH:mm:ss"的日期到 UNIX 時間戳。如果轉化失敗,則返

回 0。

舉例:

hive> select unix_timestamp('2011-12-07 13:01:03') from test;

1323234063

指定格式日期轉 UNIX 時間戳函式: unix_timestamp

語法: unix_timestamp(string date, string pattern)

返回值: bigint

說明: 轉換 pattern 格式的日期到 UNIX 時間戳。如果轉化失敗,則返回 0。

舉例:

hive> select unix_timestamp('20111207 13:01:03','yyyyMMdd HH:mm:ss') from test;

1323234063

日期時間轉日期函式: to_date

語法: to_date(string timestamp)

返回值: string

說明: 返回日期時間欄位中的日期部分。

舉例:

hive> select to_date('2011-12-08 10:03:01') from test;

2011-12-08

日期轉年函式: year

語法: year(string date)

返回值: int

說明: 返回日期中的年。

舉例:

hive> select year('2011-12-08 10:03:01') from test;

2011

hive> select year('2012-12-08') from test;

2012

日期轉月函式: month

語法: month (string date)

返回值: int

說明: 返回日期中的月份。

舉例:

hive> select month('2011-12-08 10:03:01') from test;

12

hive> select month('2011-08-08') from test;

8

日期轉天函式: day

語法: day (string date)

返回值: int

說明: 返回日期中的天。

舉例:

hive> select day('2011-12-08 10:03:01') from test;

8

hive> select day('2011-12-24') from test;

24

日期轉小時函式: hour

語法: hour (string date)

返回值: int

說明: 返回日期中的小時。

舉例:

hive> select hour('2011-12-08 10:03:01') from test;

10

日期轉分鐘函式: minute

語法: minute (string date)

返回值: int

說明: 返回日期中的分鐘。

舉例:

hive> select minute('2011-12-08 10:03:01') from test;

3

日期轉秒函式: second

語法: second (string date)

返回值: int

說明: 返回日期中的秒。

舉例:

hive> select second('2011-12-08 10:03:01') from test;

1

日期轉周函式: weekofyear

語法: weekofyear (string date)

返回值: int

說明: 返回日期在當前的週數。

舉例:

hive> select weekofyear('2011-12-08 10:03:01') from test;

49

28

日期比較函式: datediff

語法: datediff(string enddate, string startdate)

返回值: int

說明: 返回結束日期減去開始日期的天數。

舉例:

hive> select datediff('2012-12-08','2012-05-09') from test;

213

日期增加函式: date_add

語法: date_add(string startdate, int days)

返回值: string

說明: 返回開始日期 startdate 增加 days 天后的日期。

舉例:

hive> select date_add('2012-12-08',10) from test;

2012-12-18

日期減少函式: date_sub

語法: date_sub (string startdate, int days)

返回值: string

說明: 返回開始日期 startdate 減少 days 天后的日期。

舉例:

hive> select date_sub('2012-12-08',10) from test;

2012-11-28

條件函式

If 函式: if

語法: if(boolean testCondition, T valueTrue, T valueFalseOrNull)

返回值: T

說明:   當條件 testCondition 為 TRUE 時,返回 valueTrue;否則返回 valueFalseOrNull

舉例:

hive> select if(1=2,100,200) from test;

200

hive> select if(1=1,100,200) from test;

100

非空查詢函式: COALESCE

語法: COALESCE(T v1, T v2, …)

返回值: T

說明:   返回引數中的第一個非空值;如果所有值都為 NULL,那麼返回 NULL

舉例:

hive> select COALESCE(null,'100','50′) from test;

100

條件判斷函式:CASE

語法: CASE a WHEN b THEN c [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

test;

mary

hive> Select case 200 when 50 then 'tom' when 100 then 'mary' else 'tim' end from

test;

tim

條件判斷函式:CASE

語法: CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END

返回值: T

說明:如果 a 為 TRUE,則返回 b;如果 c 為 TRUE,則返回 d;否則返回 e

舉例:

hive> select case when 1=2 then 'tom' when 2=2 then 'mary' else 'tim' end from test;

mary

hive> select case when 1=1 then 'tom' when 2=2 then 'mary' else 'tim' end from test;

tom

字串函式

字元 ascii 碼函式:ascii

語法: ascii(string str)

返回值: int

說明:返回字串 str 中第一個字元的 ascii 碼

舉例:

hive> select ascii('ba') from test;

OK

98

base64 字串

語法: base64(binary bin)

返回值: string

說明:返回二進位制 bin 的 base 編碼字串

舉例:

hive> select base64(binary('test')) from test;

OK

bHh3MTIzNA==

字串連線函式:concat

語法: concat(string A, string B…)

返回值: string

說明:返回輸入字串連線後的結果,支援任意個輸入字串

舉例:

hive> select concat(‘abc’,'def’,'gh’) from test;

abcdefgh

帶分隔符字串連線函式:concat_ws

語法: concat_ws(string SEP, string A, string B…)

返回值: string

說明:返回輸入字串連線後的結果,SEP 表示各個字串間的分隔符

舉例:

hive> select concat_ws(',','abc','def','gh') from test;

abc,def,gh

陣列轉換成字串的函式:concat_ws

語法: concat_ws(string SEP, array<string>)

返回值: string

說明:返回將陣列連結成字串後的結果,SEP 表示各個字串間的分隔符

舉例:

hive> select concat_ws('|',array('a','b','c')) from test;

OK

a|b|c

小數位格式化成字串函式:format_number

語法: format_number(number x, int d)

返回值: string

說明:將數值 x 的小數位格式化成 d 位,四捨五入

舉例:

hive> select format_number(5.23456,3) from test;

OK

5.235

字串擷取函式:substr,substring

語法: substr(string A, int start),substring(string A, int start)

返回值: string

說明:返回字串 A 從 start 位置到結尾的字串

舉例:

hive> select substr('abcde',3) from test;

cde

hive> select substring('abcde',3) from test;

cde

hive>   select substr('abcde',-1) from test;   (和 ORACLE 相同)

e

字串擷取函式:substr,substring

語法: substr(string A, int start, int len),substring(string A, int start, int len)

返回值: string

說明:返回字串 A 從 start 位置開始,長度為 len 的字串

舉例:

hive> select substr('abcde',3,2) from test;

cd

hive> select substring('abcde',3,2) from test;

cd

hive>select substring('abcde',-2,2) from test;

de

字串查詢函式:instr

語法: instr(string str, string substr)

返回值: int

說明:返回字串 substr 在 str 中首次出現的位置

舉例:

hive> select instr('abcdf','df') from test;

OK

4

字串長度函式:length

語法: length(string A)

返回值: int

說明:返回字串的長度

舉例:

hive> select length('abc') from test;

OK

3

字串查詢函式:locate

語法: locate(string substr, string str[, int pos])

返回值: int

說明:返回字串 substr 在 str 中從 pos 後查詢,首次出現的位置

舉例:

hive> select locate('a','abcda',1) from test;

OK

1

hive> select locate('a','abcda',2) from test;

OK

5

字串格式化函式:printf

語法: printf(String format, Obj... args)

返回值: string

說明:將指定物件用 format 格式進行格式化.

舉例:

hive> select printf("%08X",123) from test;

OK

0000007B

字串轉換成 map 函式:str_to_map

語法: str_to_map(text[, delimiter1, delimiter2])

返回值: map<string,string>

說明:將字串按照給定的分隔符轉換成 map 結構.

舉例:

hive> select str_to_map('k1:v1,k2:v2') from test;

OK

{"k2":"v2","k1":"v1"}

hive> select str_to_map('k1=v1,k2=v2',',','=') from test;

OK

{"k2":"v2","k1":"v1"}

base64 解碼函式:unbase64(string str)

語法: unbase64(string str)

返回值: binary

說明:將給定的 base64 字串解碼成二進位制.

舉例:

hive> select unbase64('bHh3MTIzNA==') from test;

OK

test

字串轉大寫函式:upper,ucase

語法: upper(string A) ucase(string A)

返回值: string

說明:返回字串 A 的大寫格式

舉例:

hive> select upper('abSEd') from test;

ABSED

hive> select ucase('abSEd') from test;

ABSED

字串轉小寫函式:lower,lcase

語法: lower(string A) lcase(string A)

返回值: string

說明:返回字串 A 的小寫格式

舉例:

hive> select lower('abSEd') from test;

absed

hive> select lcase('abSEd') from test;

absed

去空格函式:trim

語法: trim(string A)

返回值: string

說明:去除字串兩邊的空格

舉例:

hive> select trim(' abc ') from test;

abc

左邊去空格函式:ltrim

語法: ltrim(string A)

返回值: string

說明:去除字串左邊的空格

舉例:

hive> select ltrim(' abc') from test;

abc

右邊去空格函式:rtrim

語法: rtrim(string A)

返回值: string

說明:去除字串右邊的空格

舉例:

hive> select rtrim('abc ') from test;

abc

正則表示式替換函式:regexp_replace

語法: regexp_replace(string A, string B, string C)

返回值: string

說明:將字串 A 中的符合 java 正則表示式 B 的部分替換為 C。注意,在有些情況下要

使用轉義字元,類似 oracle 中的 regexp_replace 函式。

舉例:

hive> select regexp_replace('foobar', 'oo|ar', '') from test;

fb

正則表示式解析函式:regexp_extract

語法: regexp_extract(string subject, string pattern, int index)

返回值: string

說明:將字串 subject 按照 pattern 正則表示式的規則拆分,返回 index 指定的字元。

舉例:

hive> select regexp_extract('foothebar', 'foo(.*?)(bar)', 1) from test;

the

36

hive> select regexp_extract('foothebar', 'foo(.*?)(bar)', 2) from test;

bar

hive> select regexp_extract('foothebar', 'foo(.*?)(bar)', 0) from test;

foothebar

注意,在有些情況下要使用轉義字元,下面的等號要用雙豎線轉義,這是 java 正則表示式的規則。

select data_field,

regexp_extract(data_field,'.*?bgStart\\=([^&]+)',1) as aaa,

regexp_extract(data_field,'.*?contentLoaded_headStart\\=([^&]+)',1) as bbb,

regexp_extract(data_field,'.*?AppLoad2Req\\=([^&]+)',1) as ccc

from pt_nginx_loginlog_st

where pt = '2012-03-26' limit 2;

URL 解析函式:parse_url

語法: parse_url(string urlString, string partToExtract [, string keyToExtract])

返回值: string

說明:返回 URL 中指定的部分。partToExtract 的有效值為:HOST, PATH, QUERY, REF,PROTOCOL, AUTHORITY, FILE, and USERINFO.

舉例:

hive> select parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST') from

test;

facebook.com

hive> select parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY', 'k1')

from test;

v1

json 解析函式:get_json_object

語法: get_json_object(string json_string, string path)

返回值: string

說明:解析 json 的字串 json_string,返回 path 指定的內容。如果輸入的 json 字串無

效,那麼返回 NULL。

舉例:

hive> select get_json_object('{
             
  "store":{
 
    "fruit":[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],

    "bicycle":{"price":19.95,"color":"red"}
    
  },

  "email":"amy@only_for_json_udf_test.net",

  "owner":"amy"

}','$.owner') from test;

amy

空格字串函式:space

語法: space(int n)

返回值: string

說明:返回長度為 n 的字串

舉例:

hive> select space(10) from test;

hive> select length(space(10)) from test;

10

重複字串函式:repeat

語法: repeat(string str, int n)

返回值: string

說明:返回重複 n 次後的 str 字串

舉例:

hive> select repeat('abc',5) from test;

abcabcabcabcabc

左補足函式:lpad

語法: lpad(string str, int len, string pad)

返回值: string

說明:將 str 進行用 pad 進行左補足到 len 位

舉例:

hive> select lpad('abc',10,'td') from test;

tdtdtdtabc

注意:與 GP,ORACLE 不同,pad 不能預設

右補足函式:rpad

語法: rpad(string str, int len, string pad)

返回值: string

說明:將 str 進行用 pad 進行右補足到 len 位

舉例:

hive> select rpad('abc',10,'td') from test;

abctdtdtdt

分割字串函式: split

語法:   split(string str, string pat)

返回值:   array

說明: 按照 pat 字串分割 str,會返回分割後的字串陣列

舉例:

hive> select split('abtcdtef','t') from test;

["ab","cd","ef"]

集合查詢函式: find_in_set

語法: find_in_set(string str, string strList)

返回值: int

說明: 返回str在 strlist 第一次出現的位置,strlist 是用逗號分割的字串。如果沒有找該str字元,則返回0

舉例:

hive> select find_in_set('ab','ef,ab,de') from test;

2

hive> select find_in_set('at','ef,ab,de') from test;

0

分詞函式:sentences

語法: sentences(string str, string lang, string locale)

返回值: array<array<string>>

說明:返回輸入 str 分詞後的單詞陣列

舉例:

hive> select sentences('hello word!hello hive,hi hive,hello hive') from test;

OK

[["hello","word"],["hello","hive","hi","hive","hello","hive"]]

分詞後統計一起出現頻次最高的 TOP-K

語法: ngrams(array<array<string>>, int N, int K, int pf)

返回值: array<struct<string,double>>

說明:與  sentences()函式一起使用,分詞後,統計分詞結果中 一起出現頻次最高的

TOP-K 結果

舉例:

hive> SELECT ngrams(sentences('hello  word!hello  hive,hi  hive,hello  hive'),2,2) 

	  FROM test;

[
    {"ngram":["hello","hive"],"estfrequency":2.0},
 	{"ngram":["hive","hello"],"estfrequency":1.0}
]

該查詢中,統計的是兩個詞在一起出現頻次最高的 TOP-2

結果中,hello 與 hive 同時出現 2 次

分詞後統計與指定單詞一起出現頻次最高的 TOP-K

語法: context_ngrams(array<array<string>>, array<string>, int K, int pf)

返回值: array<struct<string,double>>

說明:與 sentences()函式一起使用,分詞後,統計分詞結果中與陣列中指定的單詞一起出現(包括順序)頻次最高的 
TOP-K結果

舉例:

hive> SELECT context_ngrams(
    
    	sentences('hello    word!hello    hive,hi    hive,hellohive'),
    	
    	array('hello',null),3) 
      
      FROM test;

[{"ngram":["hive"],"estfrequency":2.0},{"ngram":["word"],"estfrequency":1.0}]

該查詢中,統計的是與’hello’一起出現,並且在 hello 後面的頻次最高的 TOP-3

結果中,hello 與 hive 同時出現 2 次,hello 與 word 同時出現 1 次。

 

hive> SELECT context_ngrams(
    
    	sentences('hello    word!hello    hive,hi  hive,hellohive'),
    
    	array(null,'hive'),3) 
      
      FROM test;

[{"ngram":["hello"],"estfrequency":2.0},{"ngram":["hi"],"estfrequency":1.0}]

該查詢中,統計的是與’hive’一起出現,並且在 hive 之前的頻次最高的 TOP-3

混合函式

用 Java 函式:java_method

語法: java_method(class, method[, arg1[, arg2..]])

返回值: varies

說明: 呼叫 Java 中的方法處理資料。

舉例:

hive> select reflect("java.net.URLEncoder", "encode", 'http://test.com',"UTF-8") from

test;

OK

http%3A%2F%2Ftest.com

該查詢中呼叫 java.net.URLEncoder 中的 encode 方法,給該方法傳的引數為 'http://test.com',"UTF-8"

呼叫 Java 函式:reflect

語法: reflect(class, method[, arg1[, arg2..]])

返回值: varies

說明: 呼叫 Java 中的方法處理資料。

舉例:

hive> select reflect("java.net.URLDecoder","decode",'http%3A%2F%2Ftest.com',"UTF-8") 
	  
	  from test;

OK

http://test.com

字串的 hash 值:hash

語法: hash(a1[, a2...])

返回值: int

說明: 返回字串的 hash 值。

舉例:

hive> select hash('test.com') from test;

OK

-809268416

XPath 解析 XML 函式

xpath

語法: xpath(string xmlstr,string xpath_expression)

返回值: array<string>

說明: 從 xml 字串中返回匹配到表示式的結果陣列。

舉例:

獲取 xml 字串中 a/b/節點的值

hive> select xpath('<a><b>b1</b><b>b2</b><c>c1</c></a>','a/b/text()') from test;

OK

["b1","b2"]

獲取 xml 字串中所有名為 id 的屬性值

hive> select xpath('<a><b id="foo">b1</b><b id="bar">b2</b></a>','//@id') from test;

OK

["foo","bar"] 

xpath_string

語法: xpath_string(string xmlstr,string xpath_expression)

返回值: string

說明: 預設情況下,從 xml 字串中返回第一個匹配到表示式的節點的值。

舉例:

hive> SELECT xpath_string ('<a><b>b1</b><b>b2</b></a>', '//b') FROM test;

OK

b1

3.

指定返回匹配到哪一個節點

hive> SELECT xpath_string ('<a><b>b1</b><b>b2</b></a>', '//b[2]') FROM test;

OK

b2

xpath_boolean

語法: xpath_boolean (string xmlstr,string xpath_expression)

返回值: boolean

說明: 返回 xml 字串中是否匹配 xml 表示式。

舉例:

hive> SELECT xpath_boolean ('<a><b>b</b></a>', 'a/b') FROM test;

OK

true

hive> SELECT xpath_boolean ('<a><b>10</b></a>', 'a/b < 10') FROM test;

OK

false

xpath_short, xpath_int, xpath_long

語法: xpath_short (string xmlstr,string xpath_expression)

xpath_int (string xmlstr,string xpath_expression)

xpath_long (string xmlstr,string xpath_expression)

返回值: int

說明: 返回 xml 字串中經過 xml 表示式計算後的值,如果不匹配,則返回 0。

舉例:

hive> SELECT xpath_int ('<a>this is not a number</a>', 'a') FROM test;

OK

0

hive> SELECT xpath_int('<a><b class="odd">1</b><b class="even">2</b><b

class="odd">4</b><c>8</c></a>', 'sum(a/*)') FROM test;

OK

15

hive> select xpath_long('<a><b>10.5</b><c>11.2</c></a>','sum(a/*)') from test;

OK

21

xpath_float, xpath_double, xpath_number

語法: xpath_float (string xmlstr,string xpath_expression)

xpath_double (string xmlstr,string xpath_expression)

xpath_number (string xmlstr,string xpath_expression)

返回值: number

說明: 返回 xml 字串中經過 xml 表示式計算後的值,如果不匹配,則返回 0。

舉例:

hive> select xpath_double('<a><b>10.5</b><c>11.2</c></a>','sum(a/*)') from test;

OK

21.7

彙總統計函式(UDAF)

個數統計函式: count

語法: count(*), count(expr), count(DISTINCT expr[, expr_.])

返回值: int

說明: count(*)統計檢索出的行的個數,包括 NULL 值的行;count(expr)返回指定欄位的

非空值的個數;count(DISTINCT expr[, expr_.])返回指定欄位的不同的非空值的個數

舉例:

hive> select count(*) from test;

20

hive> select count(distinct t) from test;

10

總和統計函式: sum

語法: sum(col), sum(DISTINCT col)

返回值: double

說明: sum(col)統計結果集中 col 的相加的結果;sum(DISTINCT col)統計結果中 col 不同值

相加的結果

舉例:

hive> select sum(t) from test;

100

hive> select sum(distinct t) from test;

70

平均值統計函式: avg

語法: avg(col), avg(DISTINCT col)

返回值: double

說明: avg(col)統計結果集中 col 的平均值;avg(DISTINCT col)統計結果中 col 不同值相加

的平均值

舉例:

hive> select avg(t) from test;

50

hive> select avg (distinct t) from test;

30

最小值統計函式: min

語法: min(col)

返回值: double

說明: 統計結果集中 col 欄位的最小值

舉例:

hive> select min(t) from test;

20

最大值統計函式: max

語法: max(col)

返回值: double

說明: 統計結果集中 col 欄位的最大值

舉例:

hive> select max(t) from test;

120

非空集合總體變數函式: var_pop

語法: var_pop(col)

返回值: double

說明: 統計結果集中 col 非空集合的總體變數(忽略 null)

舉例:

非空集合樣本變數函式: var_samp

語法: var_samp (col)

返回值: double

說明: 統計結果集中 col 非空集合的樣本變數(忽略 null)

舉例:

總體標準偏離函式: stddev_pop

語法: stddev_pop(col)

返回值: double

說明: 該函式計算總體標準偏離,並返回總體變數的平方根,其返回值與 VAR_POP 函

數的平方根相同

舉例:

樣本標準偏離函式: stddev_samp

語法: stddev_samp (col)

返回值: double

說明: 該函式計算樣本標準偏離

舉例:

中位數函式: percentile

語法: percentile(BIGINT col, p)

返回值: double

說明: 求準確的第 pth 個百分位數,p 必須介於 0 和 1 之間,但是 col 欄位目前只支援

整數,不支援浮點數型別

舉例:

中位數函式: percentile

語法: percentile(BIGINT col, array(p1 [, p2]…))

返回值: array<double>

說明: 功能和上述類似,之後後面可以輸入多個百分位數,返回型別也為 array<double>,

其中為對應的百分位數。

舉例:

select percentile(score,<0.2,0.4>) from test; 取 0.2,0.4 位置的資料

近似中位數函式: percentile_approx

語法: percentile_approx(DOUBLE col, p [, B])

返回值: double

說明: 求近似的第 pth 個百分位數,p 必須介於 0 和 1 之間,返回型別為 double,但是

col 欄位支援浮點型別。引數 B 控制記憶體消耗的近似精度,B 越大,結果的準確度越高。

預設為 10,000。當 col 欄位中的 distinct 值的個數小於 B 時,結果為準確的百分位數

舉例:

近似中位數函式: percentile_approx

語法: percentile_approx(DOUBLE col, array(p1 [, p2]…) [, B])

返回值: array<double>

說明: 功能和上述類似,之後後面可以輸入多個百分位數,返回型別也為 array<double>,

其中為對應的百分位數。

舉例:

直方圖: histogram_numeric

語法: histogram_numeric(col, b)

返回值: array<struct {‘x’,’y’}>

說明: 以 b 為基準計算 col 的直方圖資訊。

舉例:

hive> select histogram_numeric(100,5) from test;

[{"x":100.0,"y":1.0}]

集合去重數:collect_set

語法: collect_set (col) 

返回值: array

說明: 將 col 欄位進行去重,合併成一個數組。

舉例:

hive> select cookie,ip from test;

cookie1 127.0.0.1

cookie1 127.0.0.1

cookie1 127.0.0.2

cookie1 127.0.0.3

hive> select cookie,collect_set(ip) from test group by cookie;

cookie1 "127.0.0.1","127.0.0.2","127.0.0.3"]

集合不去重函式:collect_list

語法: collect_list (col)

返回值: array

說明: 將 col 欄位合併成一個數組,不去重

舉例:

hive> select cookie,ip from test;

cookie1 127.0.0.1

cookie1 127.0.0.1

cookie1 127.0.0.2

cookie1 127.0.0.3

hive>select cookie,collect_list(ip) from test group by cookie;

cookie1 "127.0.0.1","127.0.0.1","127.0.0.2","127.0.0.3"]

表格生成函式 (UDTF)

陣列拆分成多行:explode

語法: explode(ARRAY)

返回值: 多行

說明: 將陣列中的元素拆分成多行顯示

舉例:

hive> select explode(array(1,2,3)) from test;

OK

1

2

3

Map 拆分成多行:explode

語法: explode(Map)

返回值: 多行

說明: 將 Map 中的元素拆分成多行顯示

舉例:

hive> select explode(map('k1','v1','k2','v2')) from test;

OK

k2       v2

k1       v1