Hive的Lateral View

CDA老师1

Hive的Lateral View # lateral view 简介 **hive中的 lateral view 主要功能是将原本汇总在一条(行)上的数据根据表函数拆分成多条(行)成为虚拟表,然后再与原表进行拼接,从而得到粒度更细的表。lateral view配合UDTF函数使用,一般情况下经常与explode函数搭配,explode的操作对象(列值)是 ARRAY 或者 MAP ,有时候使用array函数将多列变成数组再进行转换,也可以通过 split 函数将 String 类型的列值转成 ARRAY 来处理。** **语法格式如下:** ``` select col1      ,...      ,tmp_col from sometable lateral view explode(array) tmp_table as tmp_col; ``` * **col1 ,.... 都是原始表sometable里面的字段** * **tmp_table 是explode生成的包含一列的虚拟表的别名** * **tmp_col 是explode生成的新列的别名,select查询可以直接使用这个列名** # 举例说明 **举例说明:test_table数据如图所示:包含用户ID、hobbies两列,其中bobbies列数据类型是数组类型的。** **现需将数据转换为 下图形式,方便统计汇总。** **这时可以使用explode将hobbies列展开:** ``` select explode(hobbies) hobby from test_table; ``` **查询结果如下图所示:** **那如何将上述结果与ID、hobbies列拼接在一起呢?可以这么写么?** ``` select ID,hobbies,explode(hobbies) hobby from test_table;-- 错误的用法 ``` **上面的这种写法是不对的,这样hive并不能自动的对ID、hobbies列进行扩充,如果想要实现扩充还需要结合lateral view来实现** ``` select ID      ,hobbies      ,hobby from test_table lateral view explode(hobbies) t as hobby; ``` **lateral view 会自动的将test_table 与 explode的结果进行连接,因此可以查询到想要的结果。** # 案例 ## 1、 ``` -- 创建表结构 -- 如果表存在,先删除表 drop table if exists knights_game; -- 创建表结构 create table knights_game(   gameID string   ,tags string )row format delimited fields terminated by '\t'; -- 加载本地数据到表中 load data local inpath 'data/hive_data/UDTF.tsv' into table knights_game; -- 查看表中的内容 select * from knights_game limit 10; ``` **tags 是由多个json字符串使用**`-`拼接在一起的字符串,现为了统计分析每个gameid的信息,需要将tags展开出一个个的tag,然后再做统计。可以先使用split函数对tags做拆分: ``` select split(tags,'-') from knights_game; ``` **这时每行数据由字符串转换为字符串数组:** **对数组使用exploded函数进行扩充:** ``` select explode(split(tags,'-')) from knights_game; ``` **如果想与其他的信息关联还需使用lateral view联用:** ``` select gameID        ,tags        ,tag from knights_game lateral view explode(split(tags,'-')) t as tag; ``` **一般的我们还会对tag中的json字符串进行解析,提取更细粒度的信息,这时还需要使用get_json_object函数:** ``` select gameID ,get_json_object(tag,'$.tagid') tagid ,get_json_object(tag,'$.tagname') tagname ,get_json_object(tag,'$.parent') parent from knights_game lateral view explode(split(tags,'-')) t as tag; ```
0.8288 8 0 关注作者 收藏 2022-12-20   阅读量: 948

评论(0)


暂无数据