行列转换¶
lateral view 配合UTDF函数使用,把一行查分为多行的数据¶
select …… from tabelA lateral view UDTF(xxx) 视图名 as a,b,c
与explode连用¶
-- 假设我们有一张表pageAds,它有两列数据
-- 第一列是pageid(string类型),第二列是adid_list(Array<int>类型),即用逗号分隔的广告ID集合:
pageid adid_list
"front_page" [1, 2, 3]
"contact_page" [3, 4, 5]
-- 要统计所有广告ID在所有页面中出现的次数。
-- 首先分拆广告ID:
SELECT
pageid, adid
FROM pageAds .
LATERAL VIEW explode(adid_list) adTable AS adid;
-- 执行结果如下:pageid(string类型),adid(int类型)
pageid adid
"front_page" 1
"front_page" 2
"front_page" 3
"contact_page" 3
"contact_page" 4
"contact_page" 5
-- 接下来就是一个聚合的统计:
SELECT
adid, count(1)
FROM pageAds
LATERAL VIEW explode(adid_list) adTable AS adid
GROUP BY adid;
-- 执行结果如下:
adid count(1)
1 1
2 1
3 2
4 1
5
1
与parse_url_tuple连用¶
--准备数据:vim /export/datas/lateral.txt
1 http://facebook.com/path/p1.php?query=1
2 http://www.baidu.com/news/index.jsp?uuid=frank
3 http://www.jd.com/index?source=baidu
--创建表
create table tb_url(
id int,
url string
) row format delimited fields terminated by '\t';
--加载数据
load data local inpath '/export/datas/lateral.txt' into table tb_url;
--使用UDTF解析
SELECT parse_url_tuple(url, 'HOST') from tb_url;
--使用UDTF+lateral view
select
a.*,
b.host,
b.path
from
tb_url a
lateral view parse_url_tuple(url, 'HOST',"PATH") b as host,path;
--对比
SELECT id,parse_url_tuple(url, 'HOST') from tb_url;--失败,UDTF函数不能与字段连用
select id, a.* from tb_url lateral view parse_url_tuple(url, 'HOST','PATH') a as host,path;
二、explode¶
分类:UDTF 功能:函数可以将一个array或者map展开 explode(array): 将array列表里的每个元素生成一行 explode(map): 每一对元素作为一行,key为一列,value为一列