Hive 函数学习总结1(数学统计、字符串处理函数)

在处理数据时,完全可以借助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,

Hive 函数学习总结1(数学统计、字符串处理函数)_第1张图片

具体到每个函数的语法与使用示例 

1、字符串长度函数:length

语法: length(string A)
返回值: int
说明:返回字符串A的长度

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

7

2、分割字符串函数: split 、array_contains

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

 

3、带分隔符字符串连接函数:concat_ws 

语法: concat_ws(string SEP, string A, string B…)
返回值: string
说明:返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符

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

abc,def,gh

4、字符串连接函数:concat ***

语法: concat(string A, string B…)
返回值: string
说明:返回输入字符串连接后的结果,支持任意个输入字符串

hive> select concat('abc','def','gh') from tableName;

abcdefgh

5、json解析函数:get_json_object ****

语法: get_json_object(string json_string, string path)
返回值: string
说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。

6、正则表达式解析函数:regexp_extract

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

7、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 tableName;

fb

8、字符串截取函数:substr,substring ****

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

9 、去空格函数:trim ***

语法: trim(string A)
返回值: string
说明:去除字符串两边的空格

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

abc

去空格还有左边去空格ltrim ,右边去空格rtrim

10、instr 子串的位置

instr(StrA ,subStrb) ,字符串StrA中搜索指定的子串substrb出现的位置,注意:整个默认的索引位置从1开始。如果没有找到,则返回int型值0。

示例:

select instr('abcdef','cd');

返回: 3,并不是2!

11、locate查找子串的位置

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

 

 

你可能感兴趣的:(hive,字符串处理hive,数学统计hive,数据库)