在处理数据时,完全可以借助hive 本身就已经自带的多种功能强大的函数,在拉数据的时候就同时进行了处理,不需要再傻傻的拉到本地再借助python去处理了。本文结合参考文献,将自己工作中遇到过的部分函数记录下来,进行简单介绍与用作备忘。(在不知道有哪些函数的时候,可以通过hive -e "show functions ;"查看里面有的函数。
目录
数学统计类函数
字符串函数
1、字符串长度函数:length
2、分割字符串函数: split 、array_contains
3、带分隔符字符串连接函数:concat_ws
4、字符串连接函数:concat ***
5、json解析函数:get_json_object ****
6、正则表达式解析函数:regexp_extract
7、regexp_replace
8、字符串截取函数:substr,substring ****9 、去空格函数:trim ***
10、instr 子串的位置
11、locate查找子串的位置
hive 内部有提供专门用于数学运算的函数,小到最基本的加减乘除,大到复杂点的如sum求和函数,avg取平均函数,求最大值max,最小值min,round四舍五入函数、开方sqrt函数、百分位函数percentile。
select 2+3 ,sum(click_pv),round(23.4),avg(click_pv)
from bigTable0111zw;
--结果:
5 2450 23.0 0.8678223185265439
使用的时候,要注意字段为数值类型,可以通过desc tableName 查看表中字段的取值类型,如果为string类型直接进行数据运算也不会报错,但得到的结果可能是错误的!!! ,如对string类型的'pd'字段(假设取值为 '2','11') ,则输出的为2,而不是11,因为是默认的字符串的字母排序进行比较的!这时要记得先将string 类型转换为int类型。max(cast(pd as int)) ,结果才会是11。
百分位函数
select classes,sum(exposure_pv) as sum_pv ,'avg_pd',avg(duration ) as avg_pd,percentile(duration, array(0,0.1,0.3,0.5,0.7,0.8,0.9,1.0)) as dura_per
from sniHas7Video0109zw
group by classes;
-- 结果如
sni_type7 {影视 6385 5084 0.79624119 58.58601956 [0.0,3.0,10.0,24.0,61.0,88.80000000000018,144.0,5090.0]
sni_type7 {娱乐 1051 658 0.626070409 37.87944162 [0.0,1.0,6.0,15.0,35.0,56.0,98.0,441.0]
常见的字符串函数有 长度函数length ,字符串分割函数 split ,连接函数concat ,带分隔符字符串连接(拼接函数)concat_ws, json解析函数 get_json_object,正则表达式解析函数regexp_extract,正则表达式替换函数regexp_replace ,字符串截取函数substr,substring, 字符串去空格函数trim,左右去空格函数ltirm与rtrim ,大小写转换函数 upper 与lower, 字符串反转函数reverse,
具体到每个函数的语法与使用示例
语法: length(string A)
返回值: int
说明:返回字符串A的长度
hive> select length('abcedfg') from tableName;
7
语法: split(string str, string pat)
返回值: array
说明: 按照pat字符串分割str,会返回分割后的字符串数组
hive> select split('abtcdtef','t') from tableName;
["ab","cd","ef"]
split函数array_contains结合使用,查看某个字符串中是否包含指定值。如string 类型sni_type中的一个记录取值为 "27,17,24,27" ,想看是否单个值为7(逗号分割的值都是有实际意义)的情况,这个时候如果只是用in 去判别则会显示存在,而实际是不存在。可以用view explode(split) 去做,但是最好的方式还是 array_contain和split 的组合。array_contains(split(sni_type,','),'7')
语法: concat_ws(string SEP, string A, string B…)
返回值: string
说明:返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符
hive> select concat_ws(',','abc','def','gh')from tableName;
abc,def,gh
语法: concat(string A, string B…)
返回值: string
说明:返回输入字符串连接后的结果,支持任意个输入字符串
hive> select concat('abc','def','gh') from tableName;
abcdefgh
语法: get_json_object(string json_string, string path)
返回值: string
说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。
语法: regexp_extract(string subject, string pattern, int index)
返回值: string
说明:将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。 注意正则表达式如果不熟悉问题不大,但是要知道正则表达式是有这些功能的,然后不懂就谷歌一下很快就能出答案。(见一个积累一个)
hive> select regexp_extract('foothebar', 'foo(.*?)(bar)', 1) from tableName;
the
hive> select regexp_extract('foothebar', 'foo(.*?)(bar)', 2) from tableName;
bar
hive> select regexp_extract('foothebar', 'foo(.*?)(bar)', 0) from tableName;
foothebar
strong>注意,在有些情况下要使用转义字符,下面的等号要用双竖线转义,这是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;
语法: regexp_replace(string A, string B, string C)
返回值: string
说明:将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。
hive> select regexp_replace('foobar', 'oo|ar', '') from tableName;
fb
语法: substr(string A, int start [,len]),substring(string A, int start)
返回值: string
说明:返回字符串A从start位置到结尾(或者指定长度len)的字符串
hive> select substr('abcde',3) from tableName;
cde
hive> select substring('abcde',3) from tableName;
cde
hive> select substr('abcde',3,2) from tableName;
cd
hive> select substring('abcde',3,2) from tableName;
cd
hive>select substring('abcde',-2,2) from tableName;
de
语法: trim(string A)
返回值: string
说明:去除字符串两边的空格
hive> select trim(' abc ') from tableName;
abc
去空格还有左边去空格ltrim ,右边去空格rtrim
instr(StrA ,subStrb)
,字符串StrA中搜索指定的子串substrb出现的位置,注意:整个默认的索引位置从1开始。如果没有找到,则返回int型值0。
示例:
select instr('abcdef','cd');
返回: 3,并不是2!
语法: locate(string substr, string str[, int pos])
返回值: int
说明:返回字符串 substr 在 str 中从 pos 后查找,首次出现的位置 。 注意同上面的instr参数的前两个位置含义相反了,instr第一个参数为str,第二个才为substr.如果没有找到,则返回int型值0。
举例:
hive> select locate('a','abcda',1) from test;
1
hive> select locate('a','abcda',2) from test;
5
鸣谢与参考:
https://zhuanlan.zhihu.com/p/102502175
https://blog.csdn.net/weixin_44318830/article/details/110738201?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522161024868816780273643460%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=161024868816780273643460&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~hot_rank-15-110738201.first_rank_v2_pc_rank_v29&utm_term=hive%E5%87%BD%E6%95%B0
https://blog.csdn.net/wangwangstone/article/details/112687431