Hive学习(二) 函数
1、lateral view 将一列数据拆成多行数据
lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。lateral view首先为原始表的每行调用UDTF,UTDF会把一行拆分成一或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表。
create table if not exists explode_array (userId string, userName string, tags array<string> ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' COLLECTION ITEMS TERMINATED BY ',';
select * from explode_array; OK 00001 zhzhenqin ["80","90"] 00002 hello ["java","女"] 00003 world ["java","python","90"]
select userid,username,tag from explode_array lateral view explode(tags) a as tag; OK 00001 zhzhenqin 80 00001 zhzhenqin 90 00002 hello java 00002 hello 女 00003 world java 00003 world python 00003 world 90
2、collect_set、collect_list
collect_set 是 Hive 内置的一个聚合函数, 它将某字段的值进行去重汇总, 其返回值类型是 array
collect_list 不去重
3、concat_ws()
concat_ws(',','11','22')以“,”分隔,结果为 11,22
3、explode -hive内置的表生成函数,主要用于将一行输入拆分成多行输出
select * from explode_array; OK 00001 zhzhenqin ["80","90"] 00002 hello ["java","女"] 00003 world ["java","python","90"]
UDTF一般有两种使用方法,一种直接放到select后面,一种和lateral view一起使用
select userid,username,tag from explode_array lateral view explode(tags) a as tag; OK 00001 zhzhenqin 80 00001 zhzhenqin 90 00002 hello java 00002 hello 女 00003 world java 00003 world python 00003 world 90
posexplode函数类似于explode函数,只是在返回数组中的元素同时也返回元素在数组中的索引位置
select posexplode(tags) from explode_array; OK 0 80 1 90 0 java 1 女 0 java 1 python 2 90
使用explode关键字查询map类型,需要取2列别名,并且用括号
create table if not exists explode_map ( userId string, userName string, tags map<string, int> ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' COLLECTION ITEMS TERMINATED BY ',' MAP KEYS TERMINATED BY ':';
select * from explode_map; OK 00001 zhzhenqin {"80":1,"90":2} 00002 hello {"java":10,"女":2} 00003 world {"java":1,"python":3,"90":1}
select explode(tags) from explode_map; OK 80 1 90 2 java 10 女 2 java 1 python 3 90 1
4、split
split(t.value,'\u000f')[0]