HIVE基础函数手册

一、关系运算

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;

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;

6. 大于等于比较: >=

        语法: A >= B

操作类型:所有基本类型

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

举例:

hive> select1 from lxw_dual where 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;

8. 非空判断: IS NOTNULL

语法: A IS NOT NULL

操作类型:所有类型

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

举例:

hive> select1 from lxw_dual where 1 is not null;

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%';

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> select 1 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> select 10 – 5 from lxw_dual;

    5

    hive> create table 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> select 40 * 5 from lxw_dual;

    200 

4. 除法操作: /

语法: A / B

操作类型:所有数值类型

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

举例:

    hive> select 40 / 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;

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;

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;

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;

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/format_number

方法一:

语法: round(double a, int d)

返回值: DOUBLE

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

举例:

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

3.1416 

方法二(推荐使用):

    cast

    select cast(645342.875645342 as decimal(10,2));

 

方法三

    format_number

    select format_number(12.345,2);//12.35

 

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(进1法)

语法: 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 

立方根 cbrt(DOUBLE a)

返回值:DOUBLE

select cbrt(2);

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;

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

26.求最小值 least(T v1, T v2, ...) 

     least(col_a, col_b,...,col_n)比较n个column的大小,

     过滤掉null,但是当某个column中是string或者null,而其他是int/double/float等时,返回nul

     返回值:double

      hive> select least(2,3,6,7);

     2

27.求最大值 greatest(T v1, T v2, ...)

    greatest(col_a, col_b,...,col_n)比较n个column的大小,

    过滤掉null,但是当某个column中是string或者null,而其他是int/double/float等时,返回null

    返回值:T

    hive> select greatest(2,3,6,7);

        7

28.求a的阶乘 factorial(INT a)

    返回值:BIGINT

    select factorial(2);

29.reflect

    该函数可以支持hive调用java的内置函数。

    可支持在hive表中生成uuid:regexp_replace(reflect("java.util.UUID", "randomUUID"), "-", "") uuid

    还可以通过传字段生成求最大值等

    select reflect("java.lang.Math","max",column1,column2) from test_udf

    可以说有了该函数,hive和java之间简直畅通无阻

五、日期函数

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

       4.1 指定格式日期转UNIX时间戳函数:to_unix_timestamp

       select from_unixtime(to_unix_timestamp('16/Mar/2017:12:25:01 +0800', 'dd/MMM/yyy:HH:mm:ss Z'))

       返回值:2017-03-16 12:25:01

       select from_unixtime(unix_timestamp('16/Mar/2017:12:25:01 +0800', 'dd/MMM/yyy:HH:mm:ss Z'),"yyyy-MM-dd")

       2017-03-16

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. 日期转天函数: 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

16.  返回这个月的最后一天的日期,忽略时分秒部分(HH:mm:ss) last_day(string date)

          返回值:string

          hive> select last_day('2017-02-17 08:34:23');

          2017-02-28

         返回这个月的第一天的日期,忽略时分秒部分(HH:mm:ss) trunc(string date)

         返回值:string

         hive> select trunc('2017-02-17 08:34:23','MM');

         2017-02-01

         返回这个年的第一天的日期,忽略时分秒部分(HH:mm:ss) trunc(string date)

         返回值:string

         hive> select trunc('2017-02-17 08:34:23','yyyy');或者select trunc('2017-02-17 08:34:23','YYYY');

         2017-01-01

17. 返回当前时间属性哪个季度 如quarter('2015-04-08') = 2

         返回值:int

         quarter(date/timestamp/string)

18. 返回当前时间日期:current_date

         2017-02-25

19. 返回当前时间戳:timestamp

         2017-02-25 00:28:46.724

20.添加月份add_months

21.date_format

         select date_format(data date,'yyyy-MM-dd');

22. TRUNC函数为指定元素而截去的日期值(hive中不太支持)

      TRUNC(date[,fmt])

     1.select trunc(sysdate) from dual --2011-3-18 今天的日期为2011-3-18

     2.select trunc(sysdate, 'mm') from dual --2011-3-1 返回当月第一天.

     3.select trunc(sysdate,'yy') from dual --2011-1-1 返回当年第一天

     4.select trunc(sysdate,'dd') from dual --2011-3-18 返回当前年月日

     5.select trunc(sysdate,'yyyy') from dual --2011-1-1 返回当年第一天

     6.select trunc(sysdate,'d') from dual --2011-3-13 (星期天)返回当前星期的第一天

     7.select trunc(sysdate, 'hh') from dual --2011-3-18 14:00:00 当前时间为14:41

     8.select trunc(sysdate, 'mi') from dual --2011-3-18 14:41:00 TRUNC()函数没有秒的精确

六、条件函数

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;

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表示各个字符串间的分隔符

 举例1:

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

 abc,def,gh 

 举例2:

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

    OK

a|b|c

5. 字符串截取函数(下标均是从1开始):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> select parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST') fromlxw_dual;

   facebook.com

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

   v1

15. json解析函数:get_json_object

学习连接:https://my.oschina.net/u/3204727/blog/1785044/

                  https://www.cnblogs.com/drjava/p/10486134.html

 语法: 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 

举例1:

     HIVE解析json数据

    create external table jsontest(

    appKey string comment "APPKEY",

    clickJson string comment "测试json")

    partitioned by(statis_date string comment "按照天进行分区")

    row format delimited fields terminated by '|' lines terminated by '\n';

    -- 执行建表语句(以脚本方式运行)

    hive -f createtable.sql

 

导入数据    

    load DATA LOCAL inpath '/home/put_hdfs_file/people.json' INTO TABLE jsontest partition(statis_date='20191023');

数据:

    apds|{"name":"zhangsan","age":23}

    apds|{"name":"lisi","age":24}

    apds|{"name":"wangwu","age":25}

    apds|{"name":"zhaoliu","age":26}

 

    SELECT * FROM jsontest where statis_date='20191023';

    SELECT get_json_object(age,$.Andy) FROM spark_people_json;

 

    DESC FUNCTION extended jsontest;

json_tuple一次解析多个字段

select json_tuple(svalue,'fanslockingpromotion','couponpromotion') as (fanslist, couponlist)

from aps.union_sums_sys_cfg

where skey='collectiontype';

 

举例2:

数据:

{"id": 1701439105,"ids": [2154137571,3889177061,1496915057,1663973284],"total_number": 493}

get_json_object:

select get_json_object(json_format_data,'$.id') as id,

       get_json_object(json_format_data,'$.total_number') as total_number

from(

select '{"id": 1701439105,"ids": [2154137571,3889177061,1496915057,1663973284],"total_number": 493}' as json_format_data

)t1;

json_tuple:

select t1.json_format_data,t2.* from(

select '{"id": 1701439105,"ids": [2154137571,3889177061,1496915057,1663973284],"total_number": 493}' as json_format_data

)t1

lateral view json_tuple(t1.json_format_data, 'id', 'total_number') t2 as c1, c2;

 

举例3:

{

    "IP": "192.168.1.1",

    "appName": "sichuan_yunyingyong",

    "customEvent": [

        {

            "eventName": "xx1",

            "du": "xx",

            "timestamp": "1480521763049",

            "eventParams": {

                "ContentID": "yixiuge",

                "account": "13856976635",

                "networkType": "WIFI",

                "result": "0",

                "type": "11"

            }

        },

        {

            "eventName": "xx2",

            "du": "xx",

            "timestamp": "1480521763049",

            "eventParams": {

                "ContentID": "yixiuge",

                "account": "13856976636",

                "networkType": "WIFI",

                "result": "0",

                "type": "11"

            }

        }

    ]

}

这里面有json对象,还有json array,json对象好解析,json array不好解析,接下来两者都讲解下,需要使用 lateral view

select j1.j1_ip,

j1.j1_appName,

j2.j2_customEvent_json

FROM tab_json s

lateral view json_tuple(s.json, 'IP', 'appName', 'customEvent') j1 as j1_ip, j1_appName,j1_customEvent

lateral view posexplode(split(regexp_replace(regexp_replace(j1.j1_customEvent,'\\}\\,\\{','\\}\\|\\|\\{'),'\\[|\\]',''), '\\|\\|')) j2 as j2_customEvents_pos, j2_customEvent_json

 

这个表 tab_json是包含json数据的表,json是json数据的字段,结果为

192.168.1.1     sichuan_yunyingyong     {"eventName":"xx1","du":"xx","timestamp":"1480521763049","eventParams":{"ContentID":"yixiuge","account":"13856976635","networkType":"WIFI","result":"0","type":"11"}}

192.168.1.1     sichuan_yunyingyong     {"eventName":"xx2","du":"xx","timestamp":"1480521763049","eventParams":{"ContentID":"yixiuge","account":"13856976636","networkType":"WIFI","result":"0","type":"11"}}

json数据就是直接把key当成字段,直接把key作为json_tuple方法的参数即可,这种解析json对象比较简单,如json_tuple(s.json, 'IP') 就是取json中字段IP的值,

但是,为什么原来是一条记录怎么解析成2条记录了呢,问题如下

posexplode(split(regexp_replace(regexp_replace(j1.j1_customEvent,'\\}\\,\\{','\\}\\|\\|\\{'),'\\[|\\]',''), '\\|\\|')) j2 as j2_customEvents_pos, j2_customEvent_json

 

我把json array的格式通过替换变成了 {json1} || {json2} , 这种格式再根据 || 来拆开,形成了一个有两个元素的数组

注意:hive转义符需要写两个 \

接着 posexplode 在把数组变成(pos, json) 的键值对,pos记录了元素的位置,json就是实际的json数据,这样一条数据就变成了两条了,这点要注意,数据量因为这种操作,成倍的增加

 

解释了这点,那么我想获取IP , appName , account 字段怎么办呢,我直接给出sql语句了

select j1.j1_ip,

j1.j1_appName,

j4.j4_account

FROM tab_json s

lateral view json_tuple(s.json, 'IP', 'appName', 'customEvent') j1 as j1_ip, j1_appName, j1_customEvent

lateral view posexplode(split(regexp_replace(regexp_replace(j1.j1_customEvent,'\\}\\,\\{','\\}\\|\\|\\{'),'\\[|\\]',''), '\\|\\|')) j2 as j2_customEvents_pos, j2_customEvent_json

lateral view json_tuple(j2.j2_customEvent_json, 'eventParams') j3 as j3_eventParams

lateral view json_tuple(j3.j3_eventParams, 'account') j4 as j4_account

结果如下:

192.168.1.1     sichuan_yunyingyong     13856976635

192.168.1.1     sichuan_yunyingyong     13856976636

上面的例子json array有两个元素,如果你只关注其中一个元素,那么可以如下操作

lateral view posexplode(array(split(regexp_replace(regexp_replace(j1.j1_customEvent,'\\}\\,\\{','\\}\\|\\|\\{'),'\\[|\\]',''), '\\|\\|')[1])) j2 as j2_customEvents_pos, j2_customEvent_json

split 跟上数组下标,就能取出某个元素,由于posexplode只接受 array类型的参数,可以使用array函数转换成对应的数组,这样就只有一条数据了,结果如下

192.168.1.1     sichuan_yunyingyong     13856976636

总结下:

在现在的hive版本中,hive 2还没有试用,不知道是不是已经引入了json array的解析函数了,目前的版本是不能通过方法解析的,

思路是,通过给json array替换字符,由原来的 [ {} , {} ] 变成 {} || {} 这样,在转换成数组用 posexplode 函数,这样就可以了

当然实际使用时数据放大也要注意,如果json array只有一个元素就不会放大

在只有一个元素的情况下,直接把 [ ] 去掉,用array 转成数组即可

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;

   tdtdtdtab

注意:与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,会返回分割后的字符串数组

举例1:

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

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

举例2:

         hive> select split('abtcdtef','t')[0];

         OK

         ab

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

23. 将input出现在from中的字符串替换成to中的字符串 如:translate("MOBIN","BIN","M")="MOM"

         translate(string|char|varchar input, string|char|varchar from, string|char|varchar to)

        1.translate 与replace类似是替换函数,但translate是一次替换多个单个的字符。

        2.基本用法,字符对应替换。

例子:

     select translate('1234567','123' ,'abc') from dual ;--1替换为a,2替换为b,3替换为c

  结果:abc4567 。

        3.如果 没有对应字符则替换为null;

             select translate('1234567','123' ,'ab') from dual;--3替换为null;

        结果:ab4567.

      4.如果对应字符过多,不影响

           select translate('1234567','123' ,'abccd') from dual;

     结果:abc4567

      5.如果替换字符整个为空字符 ,则直接返回null

           select translate('1234567','123' ,'') from dual;

      结果:null;

     6.如果想筛掉对应字符,应传入一个不相关字符,同时替换字符也加一个相同字符;

         select translate('1234567','&123' ,'&') from dual;

     结果:4567;

     7.如果相同字符对应多个字符,按第一个;

          select translate('12334567','1233' ,‘abcd') from dual;

     结果:abcc4567;

     8.如果想保留某些特定字符筛选掉其他的,比如筛掉汉字保留数字

         先把数字筛选掉,

         select translate('你师看了3三楼2的6开8发','#0123456789' ,'#') from dual

        再用筛选出的汉字去筛选原来的语句留下数字,

       select translate('你师看了3三楼2的6开8发','#'||translate('你师看了3三楼2的6开8发','#0123456789' ,'#'),'#') from dual;

       结果:3268;

       9.还有其他灵活用法,比如我可以判断两个字符串如果:字符串都是数字字符,然后数字字符的顺序不同,且每个字符只出现一次,

            我可以判断他们包含的数字是不是完全一致;

           比如比较123 和132;

          select 1  from dual where

          translate('0123456789','123' ,'aaaaaaaaaa') =translate('0123456789','132' ,'aaaaaaaaaa')

        结果:1 ,也就是where中的等式成立;

24. 将字符串A转换第一个字母大写其余字母的字符串

          initcap(string A)

25. 行转列:explode (posexplode Available as of Hive 0.13.0)

          hive> select explode(split(concat_ws('-','1','2','3','4','5','6','7','8','9'),'-'));

     -- 列转行:EXPLODE,LATERAL VIEW:

         select explode(array('liubei','zhangfei','guanyu')) ;

         select explode(map('liubei','18','zhangfei','19'));

26. hive中实现mysql的group_concat功能

            collect_set()带有去重功能、collect_list()不去重、collect_all()

           可以对collect_list()中的元素进行排序、sort_array(collect_list()),

          统计collect_list()中元素的个数:size(collect_list())

-- 行列转化

create table person_info(name string,contellation string,blood_type string);

INSERT INTO person_info(name,contellation,blood_type) VALUES

("悟空","白羊座","A"),

("张飞","射手座","A"),

("刘备","白羊座","B"),

("八戒","白羊座","A"),

("小乔","射手座","A");

SELECT * FROM person_info;

SELECT t.base,concat_ws('|',collect_set(name))names

from(

SELECT name,concat(contellation,blood_type) AS base

FROM person_info)t

GROUP BY t.base;

SELECT name,collect_set(contellation) FROM person_info GROUP BY name;

26. minus

store_name  Sales Date

Los Angeles $1500 Jan-05-1999

San Diego   $250  Jan-07-1999

Los Angeles $300  Jan-08-1999

Boston      $700  Jan-08-1999

Internet Sales 表格

Date        Sales

Jan-07-1999 $250

Jan-10-1999 $535

Jan-11-1999 $320

Jan-12-1999 $750

 

SELECT Date FROM Store_Information

MINUS

SELECT Date FROM Internet_Sales

结果:

Date

Jan-05-1999

Jan-08-1999

“Jan-05-1999”, “Jan-07-1999”, and “Jan-08-1999” 是 “SELECT Date FROM Store_Information” 所产生的结果。在这里面,“Jan-07-1999” 是存在于 “SELECT Date FROM Internet_Sales” 所产生的结果中。因此 “Jan-07-1999” 并不在最后的结果中。

请注意,在 MINUS 指令下,不同的值只会被列出一次。

注:minus最终结果:只存在于minus上面的sql结果,并且结果不在minus下面的sql结果中

27. INTERSECT

28. base64 字符串

            语法: base64(binary bin)

            返回值: string

           说明:返回二进制 bin 的 base 编码字符串

           举例:

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

          OK

         dGVzdA==

29.base64 解码函数:unbase64(string str)

           语法: unbase64(string str)

          返回值: binary

          说明:将给定的 base64 字符串解码成二进制.

          hive> select unbase64('dGVzdA==');

          OK

          test

30.字符串查找函数: instr

         语法: instr(string str, string substr)

         返回值: int

        说明:返回字符串 substr 在 str 中首次出现的位置

        举例:

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

        OK

         4

31.字符串查找函数:locate

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

         返回值: int

         说明:返回字符串 substr 在 str 中从 pos 后查找,首次出现的位置

         举例1:

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

         OK

         4

        举例2:

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

         OK

         4

32.字符串转换成 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',',','=') fromtest;

         OK

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

33.分词函数:sentences

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

         返回值: array<array<string>>

         说明:返回输入 str 分词后的单词数组

         举例:

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

         OK

         有些符号是无法识别的,逗号和句号等符号会别删除

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

34.分词后统计一起出现频次最高的 TOP-K

         语法: ngrams(array<array>, 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  iteblog;

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

         该查询中,统计的是两个词在一起出现频次最高的 TOP-2

         结果中,hello 与 hive 同时出现 2 次

35.分词后统计与指定单词一起出现频次最高的 TOP-K

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

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

         说明:与 sentences()函数一起使用,分词后,统计分词结果中与数组中指定的单词一起出现(包括顺序)频次最高的 TOP-K 结果

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

         [{"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,hello hive'),array(null,'hive'),3) FROM iteblog;

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

    -- 该查询中,统计的是与’hive’一起出现,并且在 hive 之前的频次最高的 TOP-3

 

八、集合统计函数

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

说明:

      sum和count

     sum(1)=count(1)都是指表中的记录数

     sum、count、avg等求和,平均数进行计算时都会把null过滤掉

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 

说明:

      对字符型数据的最大值,是按照首字母由A~Z的顺序排列,越往后,其值越大。当然,对于汉字则是按照其全拼拼音排列的,若首字符相同,则比较下一个字符,以此类推。

当然,对与日期时间类型的数据也可以求其最大/最小值,其大小排列就是日期时间的早晚,越早认为其值越小

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"} 

  返回map中的所有key: map_keys(Map<K.V>)

  返回map中的所有value:map_values(Map<K.V>)

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"]

  如该数组Array<T>包含value返回true。,否则返回false array_contains(Array<T>, value)

   按自然顺序对数组进行排序并返回 sort_array(Array<T>)

 

十、复杂类型访问操作

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 select array("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类型的长度

  举例:map是kv对的形式,所以返回值是2

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

  2 

  注意使用size时,如果字段为空可能结果会出现错误,避免出现错误应先对字段进行判断是否为空

  sum(if(length(p_9)==0,0,size(split(p_9,","))))

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;

1

 

一、关系运算: 4 1. 等值比较: = 4 2. 不等值比较: 4 3. 小于比较: < 4 4. 小于等于比较: 5 6. 大于等于比较: >= 5 7. 空值判断: IS NULL 5 8. 非空判断: IS NOT NULL 6 9. LIKE比较: LIKE 6 10. JAVA的LIKE操作: RLIKE 6 11. REGEXP操作: REGEXP 7 二、数学运算: 7 1. 加法操作: + 7 2. 减法操作: - 7 3. 乘法操作: * 8 4. 除法操作: / 8 5. 取余操作: % 8 6. 位与操作: & 9 7. 位或操作: | 9 8. 位异或操作: ^ 9 9.位取反操作: ~ 10 三、逻辑运算: 10 1. 逻辑与操作: AND 10 2. 逻辑或操作: OR 10 3. 逻辑非操作: NOT 10 四、数值计算 11 1. 取整函数: round 11 2. 指定精度取整函数: round 11 3. 向下取整函数: floor 11 4. 向上取整函数: ceil 12 5. 向上取整函数: ceiling 12 6. 取随机数函数: rand 12 7. 自然指数函数: exp 13 8. 以10为底对数函数: log10 13 9. 以2为底对数函数: log2 13 10. 对数函数: log 13 11. 幂运算函数: pow 14 12. 幂运算函数: power 14 13. 开平方函数: sqrt 14 14. 二进制函数: bin 14 15. 十六进制函数: hex 15 16. 反转十六进制函数: unhex 15 17. 进制转换函数: conv 15 18. 绝对值函数: abs 16 19. 正取余函数: pmod 16 20. 正弦函数: sin 16 21. 反正弦函数: asin 16 22. 余弦函数: cos 17 23. 反余弦函数: acos 17 24. positive函数: positive 17 25. negative函数: negative 17 五、日期函数 18 1. UNIX时间戳转日期函数: from_unixtime 18 2. 获取当前UNIX时间戳函数: unix_timestamp 18 3. 日期转UNIX时间戳函数: unix_timestamp 18 4. 指定格式日期转UNIX时间戳函数: unix_timestamp 18 5. 日期时间转日期函数: to_date 19 6. 日期转年函数: year 19 7. 日期转月函数: month 19 8. 日期转天函数: day 19 9. 日期转小时函数: hour 20 10. 日期转分钟函数: minute 20 11. 日期转秒函数: second 20 12. 日期转周函数: weekofyear 20 13. 日期比较函数: datediff 21 14. 日期增加函数: date_add 21 15. 日期减少函数: date_sub 21 六、条件函数 21 1. If函数: if 21 2. 非空查找函数: COALESCE 22 3. 条件判断函数:CASE 22 4. 条件判断函数:CASE 22 七、字符串函数 23 1. 字符串长度函数:length 23 2. 字符串反转函数:reverse 23 3. 字符串连接函数:concat 23 4. 带分隔符字符串连接函数:concat_ws 23 5. 字符串截取函数:substr,substring 24 6. 字符串截取函数:substr,substring 24 7. 字符串转大写函数:upper,ucase 24 8. 字符串转小写函数:lower,lcase 25 9. 去空格函数:trim 25 10. 左边去空格函数:ltrim 25 11. 右边去空格函数:rtrim 25 12. 正则表达式替换函数:regexp_replace 26 13. 正则表达式解析函数:regexp_extract 26 14. URL解析函数:parse_url 26 15. json解析函数:get_json_object 27 16. 空格字符串函数:space 27 17. 重复字符串函数:repeat 27 18. 首字符ascii函数:ascii 28 19. 左补足函数:lpad 28 20. 右补足函数:rpad 28 21. 分割字符串函数: split 28 22. 集合查找函数: find_in_set 29 八、集合统计函数 29 1. 个数统计函数: count 29 2. 总和统计函数: sum 29 3. 平均值统计函数: avg 30 4. 最小值统计函数: min 30 5. 最大值统计函数: max 30 6. 非空集合总体变量函数: var_pop 30 7. 非空集合样本变量函数: var_samp 31 8. 总体标准偏离函数: stddev_pop 31 9. 样本标准偏离函数: stddev_samp 31 10.中位数函数: percentile 31 11. 中位数函数: percentile 31 12. 近似中位数函数: percentile_approx 32 13. 近似中位数函数: percentile_approx 32 14. 直方图: histogram_numeric 32 九、复合类型构建操作 32 1. Map类型构建: map 32 2. Struct类型构建: struct 33 3. array类型构建: array 33 十、复杂类型访问操作 33 1. array类型访问: A[n] 33 2. map类型访问: M[key] 34 3. struct类型访问: S.x 34 十一、复杂类型长度统计函数 34 1. Map类型长度函数: size(Map) 34 2. array类型长度函数: size(Array) 34 3. 类型转换函数 35
1. HIVE结构 Hive 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数 据提取转化加载 (ETL),这是一种可以存储、 查询和分析存储在 Hadoop 中的大规模数据的 机制。 Hive 定义了简单的类 SQL 查询语言,称为 QL,它允许熟悉 SQL 的用户查询数据。 同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理 内建的 mapper 和 reducer 无法完成的复杂的分析工作。 1.1HIVE 架构 Hive 的结构可以分为以下几部分: 用户接口:包括 CLI, Client, WUI 元数据存储。通常是存储在关系数据库如 mysql, derby 中 6 解释器、编译器、优化器、执行器 Hadoop:用 HDFS 进行存储,利用 MapReduce 进行计算 1、 用户接口主要有三个: CLI,Client 和 WUI。其中最常用的是 CLI , Cli 启动的时候, 会同时启动一个 Hive 副本。 Client 是 Hive 的客户端,用户连接至 Hive Server 。 在启动 Client 模式的时候, 需要指出 Hive Server 所在节点,并且在该节点启动 Hive Server 。 WUI 是通过浏览器访问 Hive 。 2、 Hive 将元数据存储在数据库中,如 mysql 、 derby 。 Hive 中的元数据包括表的名字, 表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。 3、 解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及 查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有 MapReduce 调用执行。 4、 Hive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成(包含 * 的查询,比 如 select * from tbl 不会生成 MapRedcue 任务)。 1.2Hive 和 Hadoop 关系 Hive 构建在 Hadoop 之上, HQL 中对查询语句的解释、优化、生成查询计划是由 Hive 完成的 所有的数据都是存储在 Hadoop 中 查询计划被转化为 MapReduce 任务,在 Hadoop 中执行(有些查询没有 MR 任 务,如: select * from table ) Hadoop和 Hive 都是用 UTF-8 编码的 7 1.3Hive 和普通关系数据库的异同 Hive RDBMS 查询语言 HQL SQL 数据存储 HDFS Raw Device or Local FS 索引 无 有 执行 MapReduce Excutor 执行延迟 高 低 处理数据规模 大 小 1. 查询语言。由于 SQL 被广泛的应用在数据仓库中,因此,专门针对 Hive 的特性设计 了类 SQL 的查询语言 HQL。熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开 发。 2. 数据存储位置。 Hive 是建立在 Hadoop 之上的,所有 Hive 的数据都是存储在 HDFS 中 的。而数据库则可以将数据保存在块设备或者本地文件系统中。 3. 数据格式。 Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数 据格式需要指定三个属性:列分隔符(通常为空格、” t ”、” x001″)、行分隔符 (” n”)以及读取文件数据的方法( Hive 中默认有三个文件格式 TextFile , SequenceFile 以及 RCFile )。由于在加载数据的过程中,不需要从用户数据格式到 Hive 定义的数据格式的转换,因此, Hive 在加载的过程中不会对数据本身进行任何修 改,而只是将数据内容复制或者移动到相应的 HDFS 目录中。而在数据库中,不同的数 据库有不同的存储引擎,定义了自己的数据格式。所有数据都会按照一定的组织存储, 因此,数据库加载数据的过程会比较耗时。 4. 数据更新。由于 Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。 因此, Hive 中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。 而数据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO ... VALUES 添加数据,使用 UPDATE ... SET 修改数据。 5. 索引。之前已经说过, Hive 在加载数据的过程中不会对数据进行任何处理,甚至不会 对数据进行扫描,因此也没有对数据中的某些 Key 建立索引。 Hive 要访问数据中满足 条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于 MapReduce 的引 入, Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问, Hive 仍然 可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特 定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较 高,决定了 Hive 不适合在线数据查询。 6. 执行。 Hive 中大多数查询的执行是通过 Hadoop 提供的 MapReduce 来实现的(类似 select * from tbl 的查询不需要 MapReduce)。而数据库通常有自己的执行引擎。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值