前言
本文不定期更新,记录工作中接触使用过的Hive函数
常用函数
- get_json_object(string json_string,string path)
该函数的第一个参数是json对象变量,第二个参数使用$表示json变量标识,然后用.或[]读取对象或数组
select get_json_object(pricecount,'$.buyoutRoomRequest') new_id,pricecount
from table_sample a
where d='2018-08-31' limit 100
- json_tuple(string json_string,string k1,string k2...)
该函数的第一个参数是json对象变量,之后的参数是不定长参数,是一组键k1,k2...,返回值是元组,该方法比get_json_object高效,因为可以在一次调用中输入多个键值
select m.*,n.pricecount
from (select
from table_sample a
where d='2018-08-31' limit 100)n
lateral view json_tuple(pricecount,'paymentType','complete') m as f1,f2
- split(str,regex)
Splits str arround occourances that match regex.该函数第一个参数是字符串,第二个参数是设定的分隔符,通过第二个参数把第一个参数做拆分,返回一个数组
select split('123,3455,2568',',')
select split('sfas:sdfs:sf',':')
- explode()
explode takes an array (or a map) as an input and outputs the elements of the array (map) as separate rows;该函数接收一个参数,参数类型需是array或者map类型,该函数的输出是把输入参数的每个元素拆成独立的一行记录。
select explode(split('123,3455,2568',','))
- lateral view()
lateral view udtf(expression) tableAlias as columnAlias (',' columnAlias);Lateral View 一般与用户自定义表生成函数(如explode())结合使用。UDTF为每个输入行生成零个或多个输出行,Lateral view首先将UDTF应用于基表的每一行,然后将结果输出行连接到输入行,已形成具有提供的表别名的虚拟表。
select j.nf,p.* from (
select m.*,n.pricecount
from (select * from ods_htl_htlinfogoverndb.buyout_appraise a where d = '${zdt.format("yyyy-MM-dd")}' limit 100)n
lateral view json_tuple(pricecount,'paymentType','complete') m as f1,f2 )p
lateral view explode(split(regexp_replace(p.f1,'\\[|\\]',''),',')) j as nf
- from_unixtime(int/bigint timestamp,string format)
该函数第一个参数接收int/bigint类型的10位时间戳变量,带毫秒的13位时间戳需要做截取,第二个参数是返回的日期的格式,可以不设置,默认是格式:yyyy-MM-dd HH:mm:ss
select from_unixtime(1000000000);
select from_unixtime(1000000000,'yyyy-MM-dd HH');
- unix_timestamp(string date,string format)
该函数有两个参数,但两个参数都是可选参数,具体区别如下:
unix_timestamp():不带参数时返回当前时间戳,current_timestamp()有同样功能
unix_timestamp(string date):只带第一个参数时,返回date对应的时间戳,date的格式必须为yyyy-MM-dd HH:mm:ss
unix_timestamp(string date,string format):返回date对应的时间戳,date格式由format指定
select unix_timestamp();
select unix_timestamp('2018-09-05 10:24:36');
select unix_timestamp('2018-09-05 10','yyyy-MM-dd HH');
- str_to_map(String text,String delimiter1,String delimiter2)
使用两个分隔符将文本拆分成键值对。Delimiter1将文本分成k-v对,Delimiter2分割每个k-v对。对于delimiter1的默认值是',',delimiter2的默认值是'='.
select str_to_map('abc:11&bcd:22', '&', ':')
- collect_set()
该函数只接受基本的数据类型,主要作用是将某字段的值进行去重汇总,返回值是array类型字段
with t as (
select 1 id,123 value
union all
select 1 id,234 value
union all
select 2 id,124 value
)
select t.id,collect_set(t.value)
from t
group by t.id
- collect_list()
该函数功能等同于collect_set,唯一的区别在于collect_set会去除重复元素,collect_list不去除重复元素,示例sql如下
with t as (
select 1 id,123 value
union all
select 1 id,234 value
union all
select 2 id,124 value
union all
select 2 id,124 value
)
select t.id,collect_set(t.value),collect_list(t.value)
from t
group by t.id
concat_ws(seperator,String s1,String s2...)
该函数通过分割符seperator将字符串拼接起来,通常配合group by和collect_set使用array_contains(Array
,value)
该函数的用来判断Arrary中是否包含元素value,返回值是boolean
select array_contains(array(1,2,3,4,5),3)
true
percentile(expr,pc)
该函数用来计算参数expr的百分位数,expr:字段类型必须是INT,否则报错;pc:百分位数,已数值形式传入percentile_approx(expr,pc,[nb])
该函数也是用来计算参数expr的百分位数,但数据类型要求没有percentile严格,该函数数值类似类型都可以;pc:百分位数,可以以数组形式传入,因此可以一次性查看多个指定百分位数;[nb]:控制内存消耗的精度,选填regexp_replace
该函数用来进行字符串替换,下面实例是用来替换某些特殊字符
\t:tab \r:回车 \n:换行
select regexp_replace('string','\n|\t|\r|','')