前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >hive lateral view 与 explode详解[通俗易懂]

hive lateral view 与 explode详解[通俗易懂]

作者头像
全栈程序员站长
发布2022-11-08 15:54:28
3.8K0
发布2022-11-08 15:54:28
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步

1.explode

hive wiki对于expolde的解释如下:

explode() takes in an array (or a map) as an input and outputs the elements of the array (map) as separate rows. UDTFs can be used in the SELECT expression list and as a part of LATERAL VIEW.

As an example of using explode() in the SELECT expression list, consider a table named myTable that has a single column (myCol) and two rows:

Then running the query:

代码语言:javascript
复制
SELECT explode(myCol) AS myNewCol FROM myTable;

will produce:

The usage with Maps is similar:

代码语言:javascript
复制
SELECT explode(myMap) AS (myMapKey, myMapValue) FROM myMapTable;

总结起来一句话:explode就是将hive一行中复杂的array或者map结构拆分成多行。

使用实例: xxx表中有一个字段mvt为string类型,数据格式如下:

[{“eid”:“38”,“ex”:“affirm_time_Android”,“val”:“1”,“vid”:“31”,“vr”:“var1”},{“eid”:“42”,“ex”:“new_comment_Android”,“val”:“1”,“vid”:“34”,“vr”:“var1”},{“eid”:“40”,“ex”:“new_rpname_Android”,“val”:“1”,“vid”:“1”,“vr”:“var1”},{“eid”:“19”,“ex”:“hotellistlpage_Android”,“val”:“1”,“vid”:“1”,“vr”:“var01”},{“eid”:“29”,“ex”:“bookhotelpage_Android”,“val”:“0”,“vid”:“1”,“vr”:“var01”},{“eid”:“17”,“ex”:“trainMode_Android”,“val”:“1”,“vid”:“1”,“vr”:“mode_Android”},{“eid”:“44”,“ex”:“ihotelList_Android”,“val”:“1”,“vid”:“36”,“vr”:“var1”},{“eid”:“47”,“ex”:“ihotelDetail_Android”,“val”:“0”,“vid”:“38”,“vr”:“var1”}]

用explode小试牛刀一下:

代码语言:javascript
复制
select explode(split(regexp_replace(mvt,'\\[|\\]',''),'\\},\\{')) from ods_mvt_hourly where day=20160710 limit 10;

最后出来的结果如下: {“eid”:“38”,“ex”:“affirm_time_Android”,“val”:“1”,“vid”:“31”,“vr”:“var1” “eid”:“42”,“ex”:“new_comment_Android”,“val”:“1”,“vid”:“34”,“vr”:“var1” “eid”:“40”,“ex”:“new_rpname_Android”,“val”:“1”,“vid”:“1”,“vr”:“var1” “eid”:“19”,“ex”:“hotellistlpage_Android”,“val”:“1”,“vid”:“1”,“vr”:“var01” “eid”:“29”,“ex”:“bookhotelpage_Android”,“val”:“0”,“vid”:“1”,“vr”:“var01” “eid”:“17”,“ex”:“trainMode_Android”,“val”:“1”,“vid”:“1”,“vr”:“mode_Android” “eid”:“44”,“ex”:“ihotelList_Android”,“val”:“1”,“vid”:“36”,“vr”:“var1” “eid”:“47”,“ex”:“ihotelDetail_Android”,“val”:“0”,“vid”:“38”,“vr”:“var1”} {“eid”:“38”,“ex”:“affirm_time_Android”,“val”:“1”,“vid”:“31”,“vr”:“var1” “eid”:“42”,“ex”:“new_comment_Android”,“val”:“1”,“vid”:“34”,“vr”:“var1”

2.lateral view

hive wiki 上的解释如下:

Lateral View Syntax

lateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (’,’ columnAlias)* fromClause: FROM baseTable (lateralView)*

Description

Lateral view is used in conjunction with user-defined table generating functions such as explode(). As mentioned in Built-in Table-Generating Functions, a UDTF generates zero or more output rows for each input row. A lateral view first applies the UDTF to each row of base table and then joins resulting output rows to the input rows to form a virtual table having the supplied table alias.

Example

Consider the following base table named pageAds. It has two columns: pageid (name of the page) and adid_list (an array of ads appearing on the page)

An example table with two rows:

and the user would like to count the total number of times an ad appears across all pages. A lateral view with explode() can be used to convert adid_list into separate rows using the query:

代码语言:javascript
复制
SELECT pageid, adid
FROM pageAds LATERAL VIEW explode(adid_list) adTable AS adid;

The resulting output will be

Then in order to count the number of times a particular ad appears, count/group by can be used:

代码语言:javascript
复制
SELECT adid, count(1)
FROM pageAds LATERAL VIEW explode(adid_list) adTable AS adid
GROUP BY adid;

The resulting output will be

lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表。

由此可见,lateral view与explode等udtf就是天生好搭档,explode将复杂结构一行拆成多行,然后再用lateral view做各种聚合。

3.实例

还是第一部分的例子,上面我们explode出来以后的数据,不是标准的json格式,我们通过lateral view与explode组合解析出标准的json格式数据:

代码语言:javascript
复制
SELECT ecrd, CASE WHEN instr(mvtstr,'{')=0
    AND instr(mvtstr,'}')=0 THEN concat('{',mvtstr,'}') WHEN instr(mvtstr,'{')=0
    AND instr(mvtstr,'}')>0 THEN concat('{',mvtstr) WHEN instr(mvtstr,'}')=0
    AND instr(mvtstr,'{')>0 THEN concat(mvtstr,'}') ELSE mvtstr END AS mvt
      FROM ods.ods_mvt_hourly LATERAL VIEW explode(split(regexp_replace(mvt,'\\[|\\]',''),'\\},\\{')) addTable AS mvtstr
        WHERE DAY='20160710' and ecrd is not null limit 10

查询出来的结果: xxx {“eid”:“38”,“ex”:“affirm_time_Android”,“val”:“1”,“vid”:“31”,“vr”:“var1”} xxx {“eid”:“42”,“ex”:“new_comment_Android”,“val”:“1”,“vid”:“34”,“vr”:“var1”} xxx {“eid”:“40”,“ex”:“new_rpname_Android”,“val”:“1”,“vid”:“1”,“vr”:“var1”} xxx {“eid”:“19”,“ex”:“hotellistlpage_Android”,“val”:“1”,“vid”:“1”,“vr”:“var01”} xxx {“eid”:“29”,“ex”:“bookhotelpage_Android”,“val”:“0”,“vid”:“1”,“vr”:“var01” xxx {“eid”:“17”,“ex”:“trainMode_Android”,“val”:“1”,“vid”:“1”,“vr”:“mode_Android”} xxx {“eid”:“44”,“ex”:“ihotelList_Android”,“val”:“1”,“vid”:“36”,“vr”:“var1”} xxx {“eid”:“47”,“ex”:“ihotelDetail_Android”,“val”:“1”,“vid”:“38”,“vr”:“var1”} xxx {“eid”:“38”,“ex”:“affirm_time_Android”,“val”:“1”,“vid”:“31”,“vr”:“var1”} xxx {“eid”:“42”,“ex”:“new_comment_Android”,“val”:“1”,“vid”:“34”,“vr”:“var1”}

4.Ending

Lateral View通常和UDTF一起出现,为了解决UDTF不允许在select字段的问题。 Multiple Lateral View可以实现类似笛卡尔乘积。 Outer关键字可以把不输出的UDTF的空结果,输出成NULL,防止丢失数据。

参考内容:

1.http://blog.csdn.net/oopsoom/article/details/26001307 lateral view的用法实例 2.https://my.oschina.net/leejun2005/blog/120463 复合函数的用法,比较详细 3.http://blog.csdn.net/zhaoli081223/article/details/46637517 udtf的介绍

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/191008.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月21日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.explode
  • 2.lateral view
    • Lateral View Syntax
      • Description
        • Example
        • 3.实例
        • 4.Ending
        • 参考内容:
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档