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
10       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    102
java    1
python  3
90      1

4、split

split(t.value,'\u000f')[0]

  

posted @ 2019-07-04 15:39  一个人、一座城  阅读(396)  评论(0编辑  收藏  举报