hive函数大全

这篇博客详细介绍了Hive中的各种函数,包括数学函数(如对数、三角函数、位运算)、时间函数(如获取当前时间、时间戳转换)、字符串函数(如字符串处理、分割、正则查找替换)以及加密、聚合等操作。此外,还涵盖了表生成、类型转换、集合和窗口函数的使用方法。

一、数学函数

1.1 基本运算

1.round(double a[,d])         保留d位小数,默认保留整数

2.bround(double a[,d])         保留d为小数,财务计数法(保留位的数字是单数时,后面是500则进一位,双数时不进位)

select bround(2.1651,2); =>2.17
select bround(2.1550,2); =>2.16
select bround(2.1650,2); =>2.16
select bround(2.1551,2); =>2.16

3.floor(double a)                                   向下取整
4.ceil(double a)                                    向上取整
5.abs(double a)                                    绝对值
6.positive(int/double a)                        本身
7.negative(int/double a)                       相反数
8.sign(double/int a)                              判断正负函数
9.pi()                                                    常量 Π
10.rand()                                              随机数0-1
11.exp(double) | e()                             自然对数

1.2 对数运算

12.log(double base ,double a)              log 以base为低的对数
13. ln(double a)

1.3 数学运算

14.pow(double a,double b)            a^b
15.sqrt(double a)                            a^(1/2)
16.cbrl(double a)                             a^(1/3)
17.factorial(int a)                             阶乘 a最大为20
18.pmod(a,b)                                  取余a%b
19.greatest(int a...b)                       取最大值,只能列举
20.least(int a...b)                             取最小值,只能列举

1.4 进制转化

21.bin(int a)                                            十进制转为二进制
22.hex(int a) || unhex(string a)                十进制转为十六进制
23.conv(int a,int from_pas,int to_pas)      a从from_pas进制转为to_pas进制

1.3 三角函数

24.sin(double/decmal a)||cos() tan()        三角函数
25.asin() || acos() || atan()                反三角函数
26.degrees(double a)                        弧度转角度
27.radains(double a)                        角度转弧度

1.4 位运算

28.shiftleft(int a,int b)                    a按位左移b
29.shiftright(int a,int b)                  a按位右移b
30.shiftleftunsigned(int a,int b)           (有符号)a按位左移b

二:时间函数

  2.1 获取当前的函数

        1.unix_timestamp([string date][,string format])   //获取当前时间 || 指定时间的 指定格式的时间戳

select unix_timestamp();  ==>1644806355

        2.current_timestamp()                       //获取当前时间

select current_timestamp()   ==2022-02-14 14:05:51.959

         3.current_date()                                //获取当前日期

select current_date()    ==>2022-02-14

   2.2 时间<=>时间戳

        4.from_unixtime(bigint timestamp,string format)   // 按指定格式解析时间戳

select from_unixtime(1644819052,"yyyy-MM-dd hh-mm-ss:SS")   ==>2022-02-14 06-10-52:00

        5.to_date(string timestamp)                //时间日期->日期

select to_date("2022-02-14 06-10-52:00")   -->2022-02-14 

       6.date_format(string s,string format)                //返回指定格式的时间日期

select date_format("2022-02-14 06-10-52:00","yyyy-MM-dd"); ==>2022-02-14

   2.3  获取年、季、月、日、时、分、秒

        7. year(string date)

        8.month(string date)

        9.day(string date)

        10.hour(string date)

        11.minute(string date)

        12.second(string date)

        13.weekday(string date)           //星期几(中国时间方式)

        14.dayofweek(string date)        //星期几(美国时间方式)

        15.last_day(string date)            //当月最后一天

        16.trunc(string date,string format)        //返回当月、当年的的都一天

select trunc("2022-02-14 06-10-52:00","YYYY");   ==>2022-01-01
select trunc("2022-02-14 06-10-52:00","MM");     ==>2022-02-01

  2.4 时间运算函数

        17.add_months(strirng date ,int n)        //增加月份 ,n为负数的时候为较少月份

        18.date_add(string date,int n)               //增加日期,n为负数的时候为减少天数

        19.date_sub(string date,int n)                //减少日期

        20.datediff(string date1,string date2)     //两个日期相差的天数

select datediff("2022-02-10","2022-01-11")    ==>30
select datediff("2022-01-11","2022-02-10")    ==>-30

        22.months_between(string date1,string date2)   // 两个日期相差的月份   

        23.next_day(string start_date,string day_of_week)        //下一个星期几的日期

                                                day_of_week为“Mon,Tue,Wed,Thu,Fri,Sat,Sun”

     三、字符串函数     

       3.1 字符串处理

          1.lower(string str)   || case(string str)                        //将大写字母转化为小写字母

          2.upper(string str)   || rcase(string str)                       //将小写字母转化为大写字母

          3.initcap(string str)                                                     //首字母大写

          4.lpad(string str,int len,string pad)                              //左填充

          5.rpad(string str,int len,string pad)                              //右填充

select lpad("ad",4,1);        =>11ad
select rpad("ad",4,1);        =>ad11

          6.ltrim(string str)  || rtrim(string str)  || trim(string str)   //左去空格、右去空格,左右去空格

          7.repeat(string str,int n)                                                //str 重复n次

          8.reverse(string str)                                                     //字符串反转

          9.length(string str)                                                        //字符串长度

          10.translate(string str ,string str1,string str2)                //str中str1全部替换成str2

          11.lenvenshtein(string str1,string  str2)                        //两个字符串字符之间的差异 

select levenshein("abc12abcd","abab")   =>5   =>差的是字符   c12 cd 

           12.space(int n)                                                           //重复n个空格       

           13.like                                       //匹配     _ 匹配一个字符   % 匹配多个字符

           14.rlike                                     //正则匹配   # [ ] { } ? + *  \d   \w...   用 ^  $ 匹配开始和结束

select 'abcs13' like '_cs%';            =>false
select 'abcs13' like '%cs%';            =>true

select 'abcs13' rlike '[a-z].*!';       =>false
select 'abcs13' rlike '[a-z].*';        =>true

   3.2 分割字符串

        15.split(string  str,string par)                                        // str字符串 按 符号par进行分割 

        16.str_to_map(string str,string par1,string par2)        // 将字符串分割成map的结合,par1是每次map的分割符,par2是每个key与value之间的分割符号

select str_to_map("1,a;2,b",';',',');     =>{"1":"a","2":"b"}

        16.in_file(string str,string file)                                        //在文件中查找是否有字符串

        17.instr(string str,string substr)                                    //substr在str中是否存在

        18.locate(string substr,string str[,int n])                        //substr在str中是否存在(n表示从第几个字符开始查找)

        19.find_in_set(string str,string liststr)                         //str在liststr中第一次出现的索引(liststr以","分割   

select find_in_set("s1","a2,s3,s1,f3,s1");        =>3

3.3 正则查找替换

        20. regex_extract(string str,string partten,int index)   #正则匹配查找(返回正则匹配到的第几个字符)

        21.regex_replace(string str,string partten,string substr)       #正则匹配替换(将正则匹配到的字符串替换成substr字符串)

select regexp_extract("a1,a3!a2",'^[a-z0-9].*?,([0-9a-z].*?)!.*?',1)    =>a3
select regexp_replace("a1,a3!a2",'\\d',"000");        =>a000,a000!a000

3.4 字符串拼接函数

       22.concat(str1,str2....)                                        #字符串拼接

        23.concat_ws(string par,str1,str2,....)                #有指定符号的字符串拼接

3.5 字符串截取

        24.substr(string str,int start[,int  len])                #从指定索引处截取字符串(可指定截取的长度)

        25. substring_index(string str,string par,int indexs)        #按指定符号par截取字符串,取前indexs个字符串

select substr("s1s2s3s4s5",2);                  =>1s2s3s4s5 
select substring_index("a,b,c,d,e,f",",",3);    =>a,b,c 

3.6字符串处理--             字符串=>数组

        26.sentences(string  str)                #将str分割成多维数组,维度分割符(? ! 句子结束符号),元素之间的分隔符(,)

        27.context_ngrams(Array<Array<string>>),Array<stirng>,int a)    #统计二维数组中单词数量,输出json格式,eg:array('hello'.null)  表示 有(hello+任意字符串)的数量

        28.ngrams(Array<Array<string>>,int start ,int num)                #统计相同单词数量,输出从名次start(倒序)开始,取前num名 

select sentences("hello word!hello java?scala ok.")        
                    ==> [["hello","word"],["hello","java"],["scala","ok"]]
 select context_ngrams(array(array("hello","you","fjkf"),array("hello","hive","hello","you","are")),`array`('hello',null),2);
                    ==>[{"ngram":["you"],"estfrequency":2.0},{"ngram":["hive"],"estfrequency":1.0}]
select ngrams(array(array("hello","you","fjkf"),array("hello","hive","hello","you","are")),1,2);
                    ==>[{"ngram":["hello"],"estfrequency":3.0},{"ngram":["you"],"estfrequency":2.0}] |

3.7 url解析

        29.parse_url(string urlstring,string part[,string key])  #解析url,

                        urlstring:  表示url字符串

                        part:表示需要解析的信息  ==> PROTOCOL(协议) || HOST(服务器地址,域)|| post(端口) ||PATH(路径) || query(查询)(选参数三key) ||  AUTHORITY(用户信息、网址和端口号) ||USERINFO(用户信息) || REF(引用、标识,通常用#号键) || FILE(文件)

select parse_url('https://blog.youkuaiyun.com/abcdef_12a?spm=1000.2115.3001.5343','PROTOCOL');        
            =>https
select parse_url('https://blog.youkuaiyun.com/abcdef_12a?spm=1000.2115.3001.5343','HOST');
            =>blog.youkuaiyun.com

        30.parse_url_tuple(string urlstring,str1,str2....)    #表示解析url的多个信息,str1...表示需要解析的参数

 select parse_url_tuple('https://blog.youkuaiyun.com/abcdef_12a?spm=1000.2115.3001.5343','HOST','AUTHORITY');
        =>blog.youkuaiyun.com  ||  blog.youkuaiyun.com

3.8 json 解析 

        31. get_json_object(string json,string par)                #解析json中的某个值.  (用$.属性)

        32.json_tuple(string json,par1,par2...)                        #解析多个属性

select get_json_object('{"name":"Bob","age":10}','$.name');       =>Bob
select json_tuple('{"name":"Bob","age":10}','name','age');        =>Bob  10

四、加密

        1. md5(string par)                #非对称加密(不可逆)

        2. base64(binary   b)                          #对称加密(可逆)

        3.unbase64(string par)                        #对称解密(可逆) 

        4. aes_encrypt(密码,密钥)        #对称加密(可逆) ,密钥是16位,输出是乱码(二进制),需要用base64()转

        5.aes_decrypt(密码(二进制乱码),密钥)        #对称解密(可逆)      需要用unbase64()转为二进制乱码  

select md5("abc");            ==>900150983cd24fb0d6963f7d28e17f7
select base64(cast('abc' as binary));        ==> YWJj
select unbase64("YWJj");                     ==> abc
select base64(aes_encrypt("abc",'1234567890123456'));    ==>Iig1Q00eW0x+EAlVOUTDNw==
select aes_decrypt(unbase64("Iig1Q00eW0x+EAlVOUTDNw=="),'1234567890123456');    ==>abc

五、聚合函数

5.1 基本函数

        1. count()

        2. sum()

        3. max()

        4. min()

        5. avg()

5.2 方差函数

        6. var_pop(col)        ||   variance(col)        #非空集合总体变量函数(指定列的方法)(((x1-x)^2+(x2-x)^....)/n)

        7.var_smap(col)                                        #非空集合样本变量函数(样本方差)((x1-x)^2+(x2-x)^....)/(n-1)

        8.stddev_pop(col)                                    #总体标准偏离函数(标准方差)

        9.stddev_samp(col)                                #样本标准偏离函数(样本方差)

        10.cover_pop(col)                                   #协方差函数        E=(E(X*Y)-E(X)*E(Y))/n

        11.cover_samp(col)                                #样本协方差函数   E=(E(X*Y)-E(X)*E(Y))/(n-1)

        12.corr(col1,col2)                                    #相关系数 p=∑(((xi-x平均)^2+(yi-y平均)^2))/((∑((xi-x平均)^2))^(1/2))*((∑((yi-y平均)^2))^(1/2))

5.3 中位数函数

        13. percentile(col,p)                        #中位数函数,p(int || double)[0-1]表示在这个字段什么位置的函数 (逆序排序)==>  返回的是col中max和min 中某个位置的值(p表示百分比)

        14.percentile(col,array(p1[,p2...]))       #中位数函数,求多个位置的函数 (逆序排序)

        15.percentile_approx(col,p[,B] )       #近似中位数,B表示内存消耗的近似精度,B越大,结果的精度越高,默认为10000 (逆序排序) p=(0-1)

        16 ,percentile_approx(col,array(p1,p2...)[,B] )        #近似中位数,获取多个值 (逆序排序)

teach_id字段的值=(1,2,3)
select percentile(teach_id,1.0) from t_teach;        ==>3.0
select percentile(teach_id,0.5) from t_teach;        ==>1.0
select percentile(teach_id,0.3) from t_teach;        ==>1.6
select percentile(teach_id,array(0.5,1)) from test.t_teach;    ==>[2.0,3.0]

select percentile_approx(teach_id,0.5) from test.t_teach;  ==>1.5
select percentile_approx(teach_id,array(0.2,0.4)) from test.t_teach   
                    ==>[1.0,1.2000000000000002]

    

5.4 集合

        17. collect_list(col)                #建立数组(不去重)

        18. collent_set(col)                #建立数组(去重)

        19.colect_ws(',',collect_list(col))                #返回字符串

六、表生成函数

6.1 侧方图  lateral  view

        格式   select  ... from tbname lateral view 函数(col) 别名  as  字段名 

        1. explode(array a || map m)                       #单列变多行

        2. posexplode(array a )                                #与explode相似,单列=>两列多行(index,元素)

        3. inline (array<col>)                                    #将结构体数组提取出来并插入到表中,一列=>多列

select stuname,hobby from  student_ext lateral view explode(stuhobby) a as hobby;
            ==>侧方图相当于和原表的进行了join,连接条件是侧方图中未炸裂的字段
+----------+---------+
| stuname  |  hobby  |
+----------+---------+
| henry    | sing    |
| henry    | dance   |
| henry    | read    |
| pola     | sing    |
| pola     | eat     |
| pola     | read    |
| ariel    | caton   |
| ariel    | pizzle  |
| ariel    | read    |
+----------+---------+
 select stuname,index,hobby from  student_ext lateral view posexplode(stuhobby) a as index,hobby;
+----------+--------+---------+
| stuname  | index  |  hobby  |
+----------+--------+---------+
| henry    | 0      | sing    |
| henry    | 1      | dance   |
| henry    | 2      | read    |
| pola     | 0      | sing    |
| pola     | 1      | eat     |
| pola     | 2      | read    |
| ariel    | 0      | caton   |
| ariel    | 1      | pizzle  |
| ariel    | 2      | read    |
+----------+--------+---------+
select stuname,province,city,district from student_ext lateral view inline(array(stuaddress)) a as province,city,district;
+----------+-----------+-------+-----------+
| stuname  | province  | city  | district  |
+----------+-----------+-------+-----------+
| henry    | js        | nj    | xw        |
| pola     | js        | nj    | jy        |
| ariel    | ah        | wh    | jj        |
+----------+-----------+-------+-----------+

        4.stack(int n ,val1,val2...)                              #多列转多行 (缩短行,变为列)n表示将m行数据分为 n列,m/n行

        5.group by+collect_list || collect_set             #多行转单列

        6.group by + case when                              #多行转多列

select tf.* from (select 0) t lateral view stack(3,10,20,30,40,50,60) tf;
+----------+----------+
| tf.col0  | tf.col1  |
+----------+----------+
| 10       | 20       |
| 30       | 40       |
| 50       | 60       |
+----------+----------+


t_score 原表数据
+-----------------+--------------------+----------------+
| t_score.stu_id  | t_score.course_id  | t_score.score  |
+-----------------+--------------------+----------------+
| 1               | 1                  | 80             |
| 1               | 2                  | 90             |
| 1               | 3                  | 99             |
| 2               | 1                  | 70             |
| 2               | 2                  | 60             |
| 2               | 3                  | 80             |
| 3               | 1                  | 80             |
| 3               | 2                  | 80             |
| 3               | 3                  | 80             |
| 4               | 1                  | 50             |
| 4               | 2                  | 30             |
| 4               | 3                  | 20             |
| 5               | 1                  | 76             |
| 5               | 2                  | 87             |
| 6               | 1                  | 31             |
| 6               | 3                  | 34             |
| 7               | 2                  | 89             |
| 7               | 3                  | 98             |
+-----------------+--------------------+----------------+

select stu_id,collect_list(course_id) from t_score group by stu_id;
+---------+----------+
| stu_id  |   _c1    |
+---------+----------+
| 1       | [1,2,3]  |
| 2       | [1,2,3]  |
| 3       | [1,2,3]  |
| 4       | [1,2,3]  |
| 5       | [1,2]    |
| 6       | [1,3]    |
| 7       | [2,3]    |
+---------+----------+

七、类型转换函数

        1.baniry(string  a)                #转换为二进制

        2.cast(a as type)                #将a转换为tyoe进制下的数

八、集合函数

8.1 Map集合

        1.size(Map<k,v> map)                #集合长度

        2.map_keys(Map<k,v> map)        #获取map集合中的key

        3.map_values(Map<k,v> map)        #获取集合中的value的值

8.2 array数组

        4.size(array a)                #数组长度

        5.array_contains(array a ,value  v)        # 查看数组中是否有某个元素

        6.sort_array(array)                                #数组内元素排序

九、窗口函数

       #控制粒度

        func  over(partition by filed1...  order by feilda...   rows between... and ...)

        func over(distribute by filed1... sort by feilda... rows between ... and... || range between... and ...)  

        #partition by 表示从那一行进行分区处理(可选)

        #order by 进行排序(可选)

        #between .. and ... 表示从哪一行数据到哪一行数据(可选)

        #rows表示窗口行数,range表示逻辑行数 ,unbounded preceding 第一行   unbounded  following 最后一行,current row 当前行  n preceding 前几行   n  following 后n行(可选)

9.1 function函数

        1. first_value(col)                                        #某分区排序内的第一个值

        2. last_vlaue(col)                                        #某分区排序内的最后一个值

        3.lag(col,n,default)                                     #统计往前的n行的col值,如果是null的话,则取默认值default

        4.lead(col , n,default)                                #统计往后的n行的col值,如果是null的话,则取默认值default

        5.ntile(n)                                                     #将数据切片,显示当前所在的片号,不能整分时,多出的部分放在第一切片

9.2 分析函数

        1.row_number                        #排名函数,不会重复

        2.rank()                                  #排名函数,有并列名次,名次不连续1,2,2,4

        3.dense_rank()                      #排名函数,有并列名次,名次连接1,2,2,3

        4.cume_dist                          #分区内小于等于当前值人数/总行数   函数

        5.percent_rank                     #当前行的rank值/分组内总行数

一、关系运算: 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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值