Hive函数大全
发布日期:2021-06-30 17:38:16 浏览次数:3 分类:技术文章

本文共 29853 字,大约阅读时间需要 99 分钟。

一、关系运算:

1. 等值比较: =

         语法:A=B

         操作类型:所有基本类型

         描述:如果表达式A与表达式B相等,则为TRUE;否则为FALSE

         举例:

         hive>select 1 from lxw_dual where 1=1;

         1

2. 不等值比较: <>

         语法: A <> B

操作类型:所有基本类型

描述:如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A与表达式B不相等,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where 1 <> 2;

1

3.小于比较: <

         语法: A < B

操作类型:所有基本类型

描述:如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A小于表达式B,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where 1 < 2;

1

 

4. 小于等于比较: <=

语法: A <= B

操作类型:所有基本类型

描述:如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A小于或者等于表达式B,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where 1 <= 1;

1

5. 大于比较: >

语法: A > B

操作类型:所有基本类型

描述:如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A大于表达式B,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where 2 > 1;

1

 

6. 大于等于比较: >=

语法: A >= B

操作类型:所有基本类型

描述:如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A大于或者等于表达式B,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where 1 >= 1;

1

 

注意:String的比较要注意(常用的时间比较可以先to_date之后再比较)

hive> select* from lxw_dual;

201111120900:00:00    2011111209

 

hive> selecta,b,a<b,a>b,a=b from lxw_dual;

201111120900:00:00    2011111209      false   true    false

 

7. 空值判断: IS NULL

语法: A IS NULL

操作类型:所有类型

描述:如果表达式A的值为NULL,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where null is null;

1

 

8. 非空判断: IS NOTNULL

语法: A IS NOT NULL

操作类型:所有类型

描述:如果表达式A的值为NULL,则为FALSE;否则为TRUE

举例:

hive> select1 from lxw_dual where 1 is not null;

1

 

9. LIKE比较: LIKE

语法: A LIKE B

操作类型: strings

描述:如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合表达式B  的正则语法,则为TRUE;否则为FALSE。B中字符”_”表示任意单个字符,而字符”%”表示任意数量的字符。

举例:

hive> select1 from lxw_dual where 'football' like 'foot%';

1

hive> select1 from lxw_dual where 'football' like 'foot____';

1

注意:否定比较时候用NOT ALIKE B

hive> select1 from lxw_dual where NOT 'football' like 'fff%';

1

 

10. JAVA的LIKE操作: RLIKE

语法: A RLIKE B

操作类型: strings

描述:如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合JAVA正则表达式B的正则语法,则为TRUE;否则为FALSE。

举例:

hive> select1 from lxw_dual where 'footbar’ rlike '^f.*r$’;

1

注意:判断一个字符串是否全为数字:

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

1

hive> select1 from lxw_dual where '123456aa' rlike '^\\d+$';

 

11. REGEXP操作: REGEXP

语法: A REGEXP B

操作类型: strings

描述:功能与RLIKE相同

举例:

hive> select1 from lxw_dual where 'footbar' REGEXP '^f.*r$';

1

二、数学运算:

1. 加法操作: +

语法: A + B

操作类型:所有数值类型

说明:返回A与B相加的结果。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。比如,int + int 一般结果为int类型,而int + double一般结果为double类型

举例:

hive> select1 + 9 from lxw_dual;

10

hive> createtable lxw_dual as select 1 + 1.2 from lxw_dual;

hive> describelxw_dual;

_c0     double

 

2. 减法操作: -

语法: A– B

操作类型:所有数值类型

说明:返回A与B相减的结果。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。比如,int– int 一般结果为int类型,而int– double 一般结果为double类型

举例:

hive> select10 – 5 from lxw_dual;

5

hive> createtable lxw_dual as select 5.6 – 4 from lxw_dual;

hive>describe lxw_dual;

_c0     double

 

3. 乘法操作: *

语法: A * B

操作类型:所有数值类型

说明:返回A与B相乘的结果。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。注意,如果A乘以B的结果超过默认结果类型的数值范围,则需要通过cast将结果转换成范围更大的数值类型

举例:

hive> select40 * 5 from lxw_dual;

200

 

4. 除法操作: /

语法: A / B

操作类型:所有数值类型

说明:返回A除以B的结果。结果的数值类型为double

举例:

hive> select40 / 5 from lxw_dual;

8.0

 

注意:hive中最高精度的数据类型是double,只精确到小数点后16位,在做除法运算的时候要特别注意

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

结果为4

hive>select ceil(28.0/6.99999999999999) from lxw_dual limit1;          

结果为5

 

5. 取余操作: %

语法: A % B

操作类型:所有数值类型

说明:返回A除以B的余数。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。

举例:

hive> select 41 % 5 from lxw_dual;

1

hive> select 8.4 % 4 from lxw_dual;

0.40000000000000036

注意:精度在hive中是个很大的问题,类似这样的操作最好通过round指定精度

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

0.4

6. 位与操作: &

语法: A & B

操作类型:所有数值类型

说明:返回A和B按位进行与操作的结果。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。

举例:

hive> select 4 & 8 from lxw_dual;

0

hive> select 6 & 4 from lxw_dual;

4

 

7. 位或操作: |

语法: A | B

操作类型:所有数值类型

说明:返回A和B按位进行或操作的结果。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。

举例:

hive> select 4 | 8 from lxw_dual;

12

hive> select 6 | 8 from lxw_dual;

14

 

8. 位异或操作: ^

语法: A ^ B

操作类型:所有数值类型

说明:返回A和B按位进行异或操作的结果。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。

举例:

hive> select 4 ^ 8 from lxw_dual;

12

hive> select 6 ^ 4 from lxw_dual;

2

 

9.位取反操作: ~

语法: ~A

操作类型:所有数值类型

说明:返回A按位取反操作的结果。结果的数值类型等于A的类型。

举例:

hive> select ~6 from lxw_dual;

-7

hive> select ~4 from lxw_dual;

-5

三、逻辑运算:

1. 逻辑与操作: AND

语法: A AND B

操作类型:boolean

说明:如果A和B均为TRUE,则为TRUE;否则为FALSE。如果A为NULL或B为NULL,则为NULL

举例:

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

1

 

2. 逻辑或操作: OR

语法: A OR B

操作类型:boolean

说明:如果A为TRUE,或者B为TRUE,或者A和B均为TRUE,则为TRUE;否则为FALSE

举例:

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

1

 

3. 逻辑非操作: NOT

语法: NOT A

操作类型:boolean

说明:如果A为FALSE,或者A为NULL,则为TRUE;否则为FALSE

举例:

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

1

 

四、数值计算

1. 取整函数: round

语法: round(double a)

返回值: BIGINT

说明:返回double类型的整数值部分(遵循四舍五入)

举例:

hive> select round(3.1415926) from lxw_dual;

3

hive> select round(3.5) from lxw_dual;

4

hive> create table lxw_dual as select round(9542.158) fromlxw_dual;

hive> describe lxw_dual;

_c0     bigint

 

2. 指定精度取整函数: round

语法: round(double a, int d)

返回值: DOUBLE

说明:返回指定精度d的double类型

举例:

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

3.1416

 

3. 向下取整函数: floor

语法: floor(double a)

返回值: BIGINT

说明:返回等于或者小于该double变量的最大的整数

举例:

hive> select floor(3.1415926) from lxw_dual;

3

hive> select floor(25) from lxw_dual;

25

 

4. 向上取整函数: ceil

语法: ceil(double a)

返回值: BIGINT

说明:返回等于或者大于该double变量的最小的整数

举例:

hive> select ceil(3.1415926) from lxw_dual;

4

hive> select ceil(46) from lxw_dual;

46

 

5. 向上取整函数: ceiling

语法: ceiling(double a)

返回值: BIGINT

说明:与ceil功能相同

举例:

hive> select ceiling(3.1415926) from lxw_dual;

4

hive> select ceiling(46) from lxw_dual;

46

6. 取随机数函数: rand

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

返回值: double

说明:返回一个0到1范围内的随机数。如果指定种子seed,则会等到一个稳定的随机数序列

举例:

hive> select rand() from lxw_dual;

0.5577432776034763

hive> select rand() from lxw_dual;

0.6638336467363424

hive> select rand(100) from lxw_dual;

0.7220096548596434

hive> select rand(100) from lxw_dual;

0.7220096548596434

 

7. 自然指数函数: exp

语法: exp(double a)

返回值: double

说明:返回自然对数e的a次方

举例:

hive> select exp(2) from lxw_dual;

7.38905609893065

自然对数函数: ln

语法: ln(double a)

返回值: double

说明:返回a的自然对数

举例:

hive> select ln(7.38905609893065) from lxw_dual;

2.0

 

8. 以10为底对数函数: log10

语法: log10(double a)

返回值: double

说明:返回以10为底的a的对数

举例:

hive> select log10(100) from lxw_dual;

2.0

 

9. 以2为底对数函数: log2

语法: log2(double a)

返回值: double

说明:返回以2为底的a的对数

举例:

hive> select log2(8) from lxw_dual;

3.0

 

10. 对数函数: log

语法: log(double base, double a)

返回值: double

说明:返回以base为底的a的对数

举例:

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

4.0

 

11. 幂运算函数: pow

语法: pow(double a, double p)

返回值: double

说明:返回a的p次幂

举例:

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

16.0

 

12. 幂运算函数: power

语法: power(double a, double p)

返回值: double

说明:返回a的p次幂,与pow功能相同

举例:

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

16.0

 

13. 开平方函数: sqrt

语法: sqrt(double a)

返回值: double

说明:返回a的平方根

举例:

hive> select sqrt(16) from lxw_dual;

4.0

 

14. 二进制函数: bin

语法: bin(BIGINT a)

返回值: string

说明:返回a的二进制代码表示

举例:

hive> select bin(7) from lxw_dual;

111

 

15. 十六进制函数: hex

语法: hex(BIGINT a)

返回值: string

说明:如果变量是int类型,那么返回a的十六进制表示;如果变量是string类型,则返回该字符串的十六进制表示

举例:

hive> select hex(17) from lxw_dual;

11

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

616263

 

16. 反转十六进制函数: unhex

语法: unhex(string a)

返回值: string

说明:返回该十六进制字符串所代码的字符串

举例:

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

abc

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

-

hive> select unhex(616263) from lxw_dual;

abc

 

17. 进制转换函数: conv

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

返回值: string

说明:将数值num从from_base进制转化到to_base进制

举例:

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

11

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

10001

 

18. 绝对值函数: abs

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

返回值: double       int

说明:返回数值a的绝对值

举例:

hive> select abs(-3.9) from lxw_dual;

3.9

hive> select abs(10.9) from lxw_dual;

10.9

 

19. 正取余函数: pmod

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

返回值: int double

说明:返回正的a除以b的余数

举例:

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

1

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

3

 

20. 正弦函数: sin

语法: sin(double a)

返回值: double

说明:返回a的正弦值

举例:

hive> select sin(0.8) from lxw_dual;

0.7173560908995228

 

21. 反正弦函数: asin

语法: asin(double a)

返回值: double

说明:返回a的反正弦值

举例:

hive> select asin(0.7173560908995228) from lxw_dual;

0.8

 

22. 余弦函数: cos

语法: cos(double a)

返回值: double

说明:返回a的余弦值

举例:

hive> select cos(0.9) from lxw_dual;

0.6216099682706644

 

23. 反余弦函数: acos

语法: acos(double a)

返回值: double

说明:返回a的反余弦值

举例:

hive> select acos(0.6216099682706644) from lxw_dual;

0.9

24. positive函数: positive

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

返回值: int double

说明:返回a

举例:

hive> select positive(-10) from lxw_dual;

-10

hive> select positive(12) from lxw_dual;

12

25. negative函数: negative

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

返回值: int double

说明:返回-a

举例:

hive> select negative(-5) from lxw_dual;

5

hive> select negative(8) from lxw_dual;

-8

五、日期函数

1. UNIX时间戳转日期函数:from_unixtime

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

返回值: string

说明:转化UNIX时间戳(从1970-01-01 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式

举例:

hive> select from_unixtime(1323308943,'yyyyMMdd') fromlxw_dual;

20111208

2. 获取当前UNIX时间戳函数:unix_timestamp

语法: unix_timestamp()

返回值: bigint

说明:获得当前时区的UNIX时间戳

举例:

hive> select unix_timestamp() from lxw_dual;

1323309615

3. 日期转UNIX时间戳函数:unix_timestamp

语法: unix_timestamp(string date)

返回值: bigint

说明:转换格式为"yyyy-MM-ddHH:mm:ss"的日期到UNIX时间戳。如果转化失败,则返回0。

举例:

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

1323234063

4. 指定格式日期转UNIX时间戳函数:unix_timestamp

语法: unix_timestamp(string date, string pattern)

返回值: bigint

说明:转换pattern格式的日期到UNIX时间戳。如果转化失败,则返回0。

举例:

hive> select unix_timestamp('20111207 13:01:03','yyyyMMddHH:mm:ss') from lxw_dual;

1323234063

5. 日期时间转日期函数:to_date

语法: to_date(string timestamp)

返回值: string

说明:返回日期时间字段中的日期部分。

举例:

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

2011-12-08

 

6. 日期转年函数: year

语法: year(string date)

返回值: int

说明:返回日期中的年。

举例:

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

2011

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

2012

 

7. 日期转月函数: month

语法: month (string date)

返回值: int

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

举例:

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

12

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

8

 

8. 日期转天函数: day

语法: day (string date)

返回值: int

说明:返回日期中的天。

举例:

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

8

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

24

 

9. 日期转小时函数: hour

语法: hour (string date)

返回值: int

说明:返回日期中的小时。

举例:

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

10

 

10. 日期转分钟函数: minute

语法: minute (string date)

返回值: int

说明:返回日期中的分钟。

举例:

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

3

 

11. 日期转秒函数: second

语法: second (string date)

返回值: int

说明:返回日期中的秒。

举例:

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

1

 

12. 日期转周函数:weekofyear

语法: weekofyear (string date)

返回值: int

说明:返回日期在当前的周数。

举例:

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

49

 

13. 日期比较函数: datediff

语法: datediff(string enddate, string startdate)

返回值: int

说明:返回结束日期减去开始日期的天数。

举例:

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

213

 

14. 日期增加函数: date_add

语法: date_add(string startdate, int days)

返回值: string

说明:返回开始日期startdate增加days天后的日期。

举例:

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

2012-12-18

 

15. 日期减少函数: date_sub

语法: date_sub (string startdate, int days)

返回值: string

说明:返回开始日期startdate减少days天后的日期。

举例:

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

2012-11-28

 

六、条件函数

1. If函数: if

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

返回值: T

说明: 当条件testCondition为TRUE时,返回valueTrue;否则返回valueFalseOrNull

举例:

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

200

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

100

 

2. 非空查找函数: COALESCE

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

返回值: T

说明: 返回参数中的第一个非空值;如果所有值都为NULL,那么返回NULL

举例:

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

100

 

3. 条件判断函数: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 lxw_dual;

mary

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

tim

 

4. 条件判断函数: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 lxw_dual;

mary

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

tom

 

七、字符串函数

1. 字符串长度函数:length

语法: length(string A)

返回值: int

说明:返回字符串A的长度

举例:

hive> select length('abcedfg') from lxw_dual;

7

 

2. 字符串反转函数:reverse

语法: reverse(string A)

返回值: string

说明:返回字符串A的反转结果

举例:

hive> select reverse(abcedfg’) from lxw_dual;

gfdecba

 

3. 字符串连接函数:concat

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

返回值: string

说明:返回输入字符串连接后的结果,支持任意个输入字符串

举例:

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

abcdefgh

 

4. 带分隔符字符串连接函数:concat_ws

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

返回值: string

说明:返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符

举例:

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

abc,def,gh

 

5. 字符串截取函数:substr,substring

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

返回值: string

说明:返回字符串A从start位置到结尾的字符串

举例:

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

cde

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

cde

hive>  selectsubstr('abcde',-1) from lxw_dual; (和ORACLE相同)

e

 

6. 字符串截取函数:substr,substring

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

返回值: string

说明:返回字符串A从start位置开始,长度为len的字符串

举例:

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

cd

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

cd

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

de

 

7. 字符串转大写函数:upper,ucase

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

返回值: string

说明:返回字符串A的大写格式

举例:

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

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

 

8. 字符串转小写函数:lower,lcase

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

返回值: string

说明:返回字符串A的小写格式

举例:

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

absed

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

absed

 

9. 去空格函数:trim

语法: trim(string A)

返回值: string

说明:去除字符串两边的空格

举例:

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

abc

 

10. 左边去空格函数:ltrim

语法: ltrim(string A)

返回值: string

说明:去除字符串左边的空格

举例:

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

abc

 

11. 右边去空格函数:rtrim

语法: rtrim(string A)

返回值: string

说明:去除字符串右边的空格

举例:

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

abc

 

12. 正则表达式替换函数: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 lxw_dual;

fb

 

13. 正则表达式解析函数:regexp_extract

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

返回值: string

说明:将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。

举例:

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

the

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

bar

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

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;

 

14. URL解析函数:parse_url

语法: parse_url(string urlString, string partToExtract [, stringkeyToExtract])

返回值: string

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

举例:

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

facebook.com

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

v1

15. 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 lxw_dual;

amy

 

16. 空格字符串函数:space

语法: space(int n)

返回值: string

说明:返回长度为n的字符串

举例:

hive> select space(10) from lxw_dual;

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

10

 

17. 重复字符串函数:repeat

语法: repeat(string str, int n)

返回值: string

说明:返回重复n次后的str字符串

举例:

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

abcabcabcabcabc

 

18. 首字符ascii函数:ascii

语法: ascii(string str)

返回值: int

说明:返回字符串str第一个字符的ascii码

举例:

hive> select ascii('abcde') from lxw_dual;

97

 

19. 左补足函数:lpad

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

返回值: string

说明:将str进行用pad进行左补足到len位

举例:

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

tdtdtdtabc

注意:与GPORACLE不同,pad不能默认

 

20. 右补足函数:rpad

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

返回值: string

说明:将str进行用pad进行右补足到len位

举例:

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

abctdtdtdt

 

21. 分割字符串函数: split

语法: split(string str, stringpat)

返回值: array

说明:按照pat字符串分割str,会返回分割后的字符串数组

举例:

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

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

 

22. 集合查找函数: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 lxw_dual;

2

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

0

 

八、集合统计函数

1. 个数统计函数: count

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

返回值: int

说明: count(*)统计检索出的行的个数,包括NULL值的行;count(expr)返回指定字段的非空值的个数;count(DISTINCTexpr[, expr_.])返回指定字段的不同的非空值的个数

举例:

hive> select count(*) from lxw_dual;

20

hive> select count(distinct t) from lxw_dual;

10

 

2. 总和统计函数: sum

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

返回值: double

说明: sum(col)统计结果集中col的相加的结果;sum(DISTINCT col)统计结果中col不同值相加的结果

举例:

hive> select sum(t) from lxw_dual;

100

hive> select sum(distinct t) from lxw_dual;

70

 

3. 平均值统计函数: avg

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

返回值: double

说明: avg(col)统计结果集中col的平均值;avg(DISTINCT col)统计结果中col不同值相加的平均值

举例:

hive> select avg(t) from lxw_dual;

50

hive> select avg (distinct t) from lxw_dual;

30

 

4. 最小值统计函数: min

语法: min(col)

返回值: double

说明:统计结果集中col字段的最小值

举例:

hive> select min(t) from lxw_dual;

20

 

5. 最大值统计函数: max

语法: maxcol)

返回值: double

说明:统计结果集中col字段的最大值

举例:

hive> select max(t) from lxw_dual;

120

 

6. 非空集合总体变量函数:var_pop

语法: var_pop(col)

返回值: double

说明:统计结果集中col非空集合的总体变量(忽略null)

举例:

 

7. 非空集合样本变量函数:var_samp

语法: var_samp (col)

返回值: double

说明:统计结果集中col非空集合的样本变量(忽略null)

举例:

 

8. 总体标准偏离函数:stddev_pop

语法: stddev_pop(col)

返回值: double

说明:该函数计算总体标准偏离,并返回总体变量的平方根,其返回值与VAR_POP函数的平方根相同

举例:

 

9. 样本标准偏离函数:stddev_samp

语法: stddev_samp (col)

返回值: double

说明:该函数计算样本标准偏离

举例:

 

10.中位数函数:percentile

语法: percentile(BIGINT col, p)

返回值: double

说明:求准确的第pth个百分位数,p必须介于0和1之间,但是col字段目前只支持整数,不支持浮点数类型

举例:

 

11. 中位数函数:percentile

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

返回值: array<double>

说明:功能和上述类似,之后后面可以输入多个百分位数,返回类型也为array<double>,其中为对应的百分位数。

举例:

select percentile(score,<0.2,0.4>) from lxw_dual;取0.2,0.4位置的数据

 

12. 近似中位数函数:percentile_approx

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

返回值: double

说明:求近似的第pth个百分位数,p必须介于0和1之间,返回类型为double,但是col字段支持浮点类型。参数B控制内存消耗的近似精度,B越大,结果的准确度越高。默认为10,000。当col字段中的distinct值的个数小于B时,结果为准确的百分位数

举例:

13. 近似中位数函数:percentile_approx

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

返回值: array<double>

说明:功能和上述类似,之后后面可以输入多个百分位数,返回类型也为array<double>,其中为对应的百分位数。

举例:

 

14. 直方图:histogram_numeric

语法: histogram_numeric(col, b)

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

说明:以b为基准计算col的直方图信息。

举例:

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

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

 

九、复合类型构建操作

1. Map类型构建: map

语法: map (key1, value1, key2, value2,…)

说明:根据输入的key和value对构建map类型

举例:

hive> Create table lxw_test as select map('100','tom','200','mary')as t from lxw_dual;

hive> describe lxw_test;

t       map<string,string>

hive> select t from lxw_test;

{"100":"tom","200":"mary"}

 

2. Struct类型构建: struct

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

说明:根据输入的参数构建结构体struct类型

举例:

hive> create table lxw_test as select struct('tom','mary','tim')as t from lxw_dual;

hive> describe lxw_test;

t       struct<col1:string,col2:string,col3:string>

hive> select t from lxw_test;

{"col1":"tom","col2":"mary","col3":"tim"}

 

3. array类型构建: array

语法: array(val1, val2,…)

说明:根据输入的参数构建数组array类型

举例:

hive> create table lxw_test as selectarray("tom","mary","tim") as t from lxw_dual;

hive> describe lxw_test;

t       array<string>

hive> select t from lxw_test;

["tom","mary","tim"]

 

十、复杂类型访问操作

1. array类型访问: A[n]

语法: A[n]

操作类型: A为array类型,n为int类型

说明:返回数组A中的第n个变量值。数组的起始下标为0。比如,A是个值为['foo', 'bar']的数组类型,那么A[0]将返回'foo',而A[1]将返回'bar'

举例:

hive> create table lxw_test as selectarray("tom","mary","tim") as t from lxw_dual;

hive> select t[0],t[1],t[2] from lxw_test;

tom     mary   tim

 

2. map类型访问: M[key]

语法: M[key]

操作类型: M为map类型,key为map中的key值

说明:返回map类型M中,key值为指定值的value值。比如,M是值为{'f' -> 'foo', 'b'-> 'bar', 'all' -> 'foobar'}的map类型,那么M['all']将会返回'foobar'

举例:

hive> Create table lxw_test as selectmap('100','tom','200','mary') as t from lxw_dual;

hive> select t['200'],t['100'] from lxw_test;

mary    tom

 

3. struct类型访问: S.x

语法: S.x

操作类型: S为struct类型

说明:返回结构体S中的x字段。比如,对于结构体struct foobar {int foo, int bar},foobar.foo返回结构体中的foo字段

举例:

hive> create table lxw_test as select struct('tom','mary','tim')as t from lxw_dual;

hive> describe lxw_test;

t       struct<col1:string,col2:string,col3:string>

hive> select t.col1,t.col3 from lxw_test;

tom     tim

 

十一、复杂类型长度统计函数

1.   Map类型长度函数: size(Map<K.V>)

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

返回值: int

说明:返回map类型的长度

举例:

hive> select size(map('100','tom','101','mary')) from lxw_dual;

2

 

2.   array类型长度函数: size(Array<T>)

语法: size(Array<T>)

返回值: int

说明:返回array类型的长度

举例:

hive> select size(array('100','101','102','103')) from lxw_dual;

4

 

3.   类型转换函数

类型转换函数: cast

语法: cast(expr as <type>)

返回值: Expected "=" to follow "type"

说明:返回array类型的长度

举例:

hive> select cast(1 as bigint) from lxw_dual;

 

 

 

下面附上对照表:

round(double d)--返回double型d的近似值(四舍五入),返回bigint型;

round(double d,int n)--返回保留double型d的n位小数double型近似值(四舍五入);

floor(double d)--返回<=d的最大bigint值;

ceil(double d)--返回>=d的最小bigint 值;

ceiling(double d)--返回>=d的最小bigint 值;

rand() --每行返回一个double型随机数;

rand(int seed) --每行返回一个double型随机数,整数seed是随机因子;

exp(double d)--返回e的 d幂次方,返回double型;

ln(double d)--以自然数为底d的对数,返回double型;

log10(double d)--以10为底d的对数,返回double型;

log2(double d)--以2为底d的对数,返回double型;

log(double base,double d)--以base为底d的对数,返回double型;

pow(double d,double p)--d的p次幂,返回double型;

power(double d,double p)--d的p次幂,返回double型;

sqrt(double d)--d的平方根,返回double型;

bin(bigint i)--二进制i的string类型;

hex(bigint i)--十六进制i的string类型;

hex(string str)--计算十六进制表达的str值;

unhex(string i)--hex(string str)的逆方法;

conv(bigint num,int from_base,int to_base)--将bigint类型的num从from_base进制转换成to_base进制,返回string类型;

conv(string num,int from_base,int to_base)--将string类型的num从from_base进制转换成to_base进制,返回string类型;

abs(double d)--计算double型d 的绝对值,返回double型;

pmod(int i1,int i2)--int型i1对 int型 i2取模,结果为int型;

pmod(double d1,double d2)--double型i1对double型 i2取模,结果为double型;

sin(double d)--返回d的正弦值,结果为double型;

asin(double d)--返回d的反正弦值,结果为double型;

cos(double d)--返回d 的余弦值,结果为double型;

acos(double d)--返回d的反余弦值,结果为double型;

tan(double d)--返回d的正切值,结果为double型;

atan(double d)--返回d的反正切值,结果为double型;

degrees(double d)--将弧度值d转换成角度值,结果为double型;

radians(double d)--将角度值d转换成弧度值,结果为double型;

positive(int i)--等价有效表达式是\+i,返回i,结果为int型;

positive(double d)--等价有效表达式是\+d,返回d,结果为double型;

negative(int i)--等价有效表达式是-i,返回i的负数,结果为int型;

negative(double d)--等价有效表达式是-i,返回d的负数,结果为double型;

sign(double d)--如果d是正数的话,则返回float型1.0,如果d是负数的话,则返回-1.0,否则返回0.0;

e()--数学常熟e,超越数;

PI()--数学常数Pi,圆周率;

 

hive函数之聚合函数

 

count(*)--计算总行数,包括null值;

count(expr)--计算expr表达式的值,非null的行数;

count(distinct expr[,expr_.])--计算expr表达式的值排重后非null的行数;

sum(col)--指定行的值的和;

sum(distinct col)--排重后值的和;

avg(col)--指定行的值的平均值;

avg(distinct col)--排重后的值的平均值;

min(col)--指定行的值的最小值;

max(col)--指定行的值的最大值;

variance(col)--返回col 中一组数值的方差;

var_pop(col)---返回col 中一组数值的方差;

var_samp(col)--返回col 中一组数值的样本方差;

stddev_pop(col)--返回col 中一组数值的标准偏差;

stddev_samp(col)--返回col 中一组数值的样本偏差;

covar_pop(col1,col2)--返回一组数值的协方差;

covar_samp(col1,col2)--返回一组数值的样本协方差;

corr(col1,col2)--返回两组数值的相关系数;

percentile(bigint int_expr,p)--int_expr在p(范围是[0,1])处对应的百分比,其中p是double型;

percentile(bigint int_expr,array(p1[,p2…]))--int_expr在p(范围是[0,1])处对应的百分比,其中p是double型数组;

percentile(double col,p[,NB])--col在p(范围是[0,1])处对应的百分比,其中p是double型,NB是用于估计的直方图中的仓库数量(默认10000);

percentile_approx(double col,array(p1[,p2…])[,NB])--col在p(范围是[0,1])处对应的百分比,其中p是double型数组,NB是用于估计的直方图中的仓库数量(默认10000);

histogram_numeric(col,NB)--返回NB数量的直方图仓库数组,返回结果array<struct{'x','y'}>中的值x是中心,y是仓库的高;

collect_set(col)--返回集合col元素排重后的数组;

set hive.map.aggr=true; --通过设置属性hive.map.aggr值为true来提高聚合性能;

 

hive函数之表生成函数

 

当时用表生成函数时,hive要求使用别名;

explode(ARRAY array)--返回0到多行结果,每行都对应输入的array数组中的一个元素;

explode(MAP map)--返回0到多行结果,每行对应每个map键-值对,其中一个字段是map键,另一个字段是对应的map值;

explode(ARRAY<TYPE> a)--对于a的每个元素,explode()会生成一行记录包含这个元素;

inline(ARRAY<STRUCT[,STRUCT]>)--将结构体数组提取出来并插入到表中;

json_tuple(STRING jsonStr,p1p2,…,pn)--本函数可以接受多个标签名称,对于输入的json字符串进行处理,这个与get_json_object类似,不过更高效,通过一次调用就可以获得多个键值;

parse_url_tuple(url,partname1,partname2,…,partnameN)--从url中解析出n部分信息,其输入参数是url,以及多个要抽取部分的名称。所有输入的参数类型都是string,部分名称大小写是敏感的,不应该包含空格:HOST,PATH,QUERY,REF,PROTOCOL,AUTHORITY,FILE,USERINFO,QUERY:<KEY_NAME>;

stact(int n,col1,col2,…,colM)--把M列换成N行,每行有M/N个字段,n为常数;

 

hive函数之其他内置函数

 

ascii(string s)--返回字符串s中首个ASCII字符的整数型;

base64(binary bin)--基于二进制值bin转换成基于64位的字符串;

binary(srting s)--将输入的值转换成二进制值;

binary(BINARY b)--将输入的值转换成二进制值;

cast(<expr> as <type>)--将expr转换成type类型的,例如cast('1' as bigint)会将字符串转换成bigint数值类型,如果转换失败,则返回null;

concat(binary s1,binary s2,…)--将二进制字节码按次序拼接成一个字符串;

concat(string s1,string s2,…)--将字符串s1,s2等拼接成一个字符串,例如concat('ab','cd')的结果是 'abcd';

concat_ws(string separator,string s1,string s2,…)--与concat类似,不过是使用指定的分隔符进行拼接的;

context_ngrams(array<array<string>>,array<string>,int K,int pf)--与ngrams类似,但是从每个外层数组的第二个单词数组来查找前K个字尾;

decode(binary bin,string charset)--使用指定的字符集charset将二进制bin解码成字符串(支持的字符集有:'US_ASCII','IOS-8859-1','UTF-8','UTF-16BE','UTF-16FE','UTF-16'),如果任一项输入参数为null,则结果为null;

encode(string src,string charset)--使用指定的字符集charset将字符串src编码成二进制值(支持的字符集有:'US_ASCII','IOS-8859-1','UTF-8','UTF-16BE','UTF-16FE','UTF-16'),如果任一项输入参数为null,则结果为null;

find_in_set(string s,string commaSeparatedString)--返回在以逗号分隔的字符串中s出现的位置,如果没找到则返回null;

format_number(number x,int d)--将数值x转换成‘#,###,###.##’格式字符串,并保留d位小数。如果d为0,那么输出值就没有小数点后面的值;

get_json_object(string json_string,string path)--从给定路径上的json字符串中抽取json对象,并返回这个对象的json字符串形式。如果输入的json是非法的,则返回null;

in--例如test in(val1,val2,…),其表示如果test值等于后面列表中任一值的话,则返回true;

in_file(string s,string filename)--如果文件名为filename的文件中有完整一行数据和字符串s完全匹配的话,则返回true;

instr(string str,string substr)--查找字符串str中子字符串substr第一次出现的位置;

length(string s)--计算字符串s的长度;

locate(string substr,string str[,int pos])--查找字符串str中pos位置后字符串substr第一次出现的位置;

lower(string s)--将字符串中所有字母转换成小写字母;

lcase(string s)--和lower()一样;

lpad(string s,int len,string pad)--从左边开始对字符串s使用字符串pad进行填充,最终达到len长度为止。如果字符串s本身长度比len大的话,那么多余部分会被去除;

ltrim(string s)--将字符串s前面出现的空格全部去除掉;

ngram(array<array<string>>,int N,int K,int pf)--估计文件中前K个字尾。pf是精度系数;

parse_url(string url,string partname[,string key])--从url中抽取指定部分的内容。参数url表示一个url字符串,参数partname表示要抽取的部分名称,其是大小写敏感的,可选的值有:HOST,PATH,QUERY,REF,PROTOCOL,AUTHORITY,FILE,USERINFO,QUERY:<KEY>;如果partname是QUERY的话,那么还需要指定第三个参数key;

printf(string format,Obj…args)--按照printf风格格式化输出输入的字符串;

regexp_extract(string subject,string regexp_pattern,string index)--抽取字符串subject中符合正则表达式regexp_pattern的第 index个部分的子字符串;

regexp_relpace(string s,string regex,string replacement)--按照java正则表达式regex将字符串s中符合条件的部分替换成replacement所指定的字符串a,如果replacement部分是空的话,那么符合正则的部分将会被去除掉。如regexp_relpace('hive','[ie]','z')的结果是'hzvz';

repeat(string s,int n)--重复输入n次字符串s;

reverse(string s)--反转字符串;

rpad(string s,int len,string pad)--从右面开始对字符串s使用字符串pad进行填充,最终达到len长度为止,如果字符串s本身长度比len大的话,那么多余部分将会被去除;

rtrim(string s)--将字符串s右面出现的空格全部去除掉;

sentences(string s,string lang,string locale)--将输入字符串s转换成句子数组,每个句子又由一个单词数组构成,单词lang和locale是可选的,如果没有使用,则使用默认本地化信息;

size(MAP<K.V>)--返回map中元素的个数;

size(ARRAY<T>)--返回数组array的元素个数;

space(int n)--返回n个空格;

split(string s,string pattern)--按照正则表达式pattern分割字符串s,并将分割后的部分以字符串数组的方式返回;

str_to_map(string s,string delim1,string delim2)--将字符串s按照指定分隔符转化成map,第一个参数是输入的字符串,第二个参数是键值对之间的分隔符,第三个参数是键和值之间的分隔符;

substr(string s,string start_index,string length)--对于字符串s,从start位置开始截取length长度的字符串,作为子字符串,例如substr('abcdefgh',3,5)的结果是'cdefg';

substring(string s,string start_index,string length)--对于字符串s,从start位置开始截取length长度的字符串,作为子字符串,例如substr('abcdefgh',3,5)的结果是'cdefg';

substr(binary s,string start_index,string length)--对于二进制字节值s,从start位置开始截取length长度的字符串,作为子字符串;

substring(binary s,string start_index,string length)--对于二进制字节值s,从start位置开始截取length长度的字符串,作为子字符串;

trim(string a)--将字符串a前后出现的空格全部去掉;

unbase64(string str)--将基于64位的字符串str转换成二进制值;

upper(string a)--将字符串中所有的字母转换成大写字母;

ucase(string a)--将字符串中所有的字母转换成大写字母;

from_unixtime(bigint unixtime[,string format])--将时间戳秒数转换成UTC时间,并用字符串表示,可以通过format规定的时间格式,指定输出的时间格式;

unix_timestamp()--获取当前本地时区下的当前时间戳,例如:1534132825;

unix_timestamp(string date)--输入的时间字符串格式必须是yyyy-MM-dd HH:mm:ss,如果不符合则返回0,如果符合则将此时间字符串转换成Unix时间戳,例如unix_timestamp('2009-03-20 11:30:01')=1237519801;

unix_timestamp(string date,string pattern)--将指定时间字符串格式转换成Unix时间戳,如果格式不对,则返回0,例如unix_timestamp('2009-03-20','yyyy-MM-dd')=1237478400;

to_date(string timestamp)--返回时间字符串的日期部分,例如:to_date("1970-01-01 00:00:00")="1970-01-01";

year(string date)--返回时间字符串中的年份并使用int类型表示。例如:year("1970-01-01 00:00:00")="1970";

month(string date)--返回时间字符串中的月份并使用int类型表示。例如:month("1970-01-01 00:00:00")="1";

day(string date)--返回时间字符串中的天并使用int类型表示。例如:day("1970-01-01 00:00:00")="1";

dayofmonth(string date)--返回时间字符串中的天并使用int类型表示。例如:day("1970-01-01 00:00:00")="1";

hour(string date)--返回时间字符串中的小时并使用int类型表示。例如:hour("1970-01-01 11:58:59")="11";

minute(string date)--返回时间字符串中的分钟数;

second(string date)--返回时间字符串中的秒数;

weekofyear(string date)--返回时间字符串位于一年中第几个周内,例如:weekofyear("1970-11-01 11:58:59")="44";

datediff(string enddate,string startdate)--计算开始时间startdate到结束时间enddate相差的天数,例如 datediff('2009-03-01','2009-02-27')=2;

date_add(string startdate,int days)--为开始时间startdate增加days天。例如:date_add('2018-12-31',1)='2009-01-01';

date_sub(string startdate,int days)--从开始时间startdate减去days天。例如date_sub('2008-12-31',1)='2018-12-30';

from_utc_timestamp(TIMESTAMP timestamp,STRING timezone)--如果给定的时间戳并非UTC,则将其转化成指定的时区下的时间戳;

to_utc_timestamp(TIMESTAMP timestamp,STRING timezone)--如果给定的时间戳是指定的时区下的时间戳,则将其转化成UTC下的时间戳;

 

以上是我整理的hive函数,不太全,可能有些有错误,手工打,见谅~

转载地址:https://lemonstone.blog.csdn.net/article/details/82661498 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:大数据系列的默认端口(hbase,hadoop,hived等)
下一篇:windows 编写的脚本 无法在linux下运行

发表评论

最新留言

很好
[***.229.124.182]2024年04月16日 09时37分51秒