暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Hive SQL中的lateral view explode

数据森麟 2021-03-31
303


公众号后台回复“图书“,了解更多号主新书内容

作者:胖里

来源:胖里的日常

标题中直接写lateral view explode是我鲁莽了,毕竟这俩不是法定cp,也并不是不能分开各自生活。其中explode可以放在select从句中单独使用,lateral view也可以与其他函数结合使用,之所以把它们写在一起只因为常常这么用。

今天的分享便是explode函数和lateral view语句,共1600字,预计阅读5分钟!


1. explode函数




先说一说explode函数吧。

Explode()函数是Hive的内置函数,也有人将其称为炸裂函数,此函数将array或map作为输入,按行输出array或map中的元素,可搭配lateral view使用。

举两个简单例子。

    select(array('1','2','3')) 

    当explode函数的输入是array时,array中的每个元素都单独输出为一行。

      select explode(map('A','1','B','2','C','3'))

      当explode函数的输入是map时,map中的每对key-value会单独输出为一行,key为一列,value为一列。

      图为输入为array和map实例的输出。

      有天工作写HQL的时候,有一个将某列数据拆成多行的需求,我就无脑上explode了,结果迎接我的不是预期的结果,而是大红色的error。

      看过后才发现自己给explode函数输入了一个string类型的参数,而explode函数的输入只能为array或map,那explode就无法处理string了吗?必然不是!

      遇到string的时候别忘了split()函数,split函数可以将string按照规定符号进行划分,划分结果是array,这样经过划分string变成array,就能当做explode函数的输入了,完美解决!

        select explode(split('1,2,3',','))

        输出跟array实例的输出一模一样!


        2. lateral view




        举个例子,现在有这么一张表A,是用户的订单信息表,包括用户id、用户等级、订单信息,长这样:

        还有另外一张表B里面是ordr_id及其对应的信息,长这样:

        现在需要给A表中的订单挂是否异常的tag,怎么做?

        直接需求就是将A中的ordr_set拆分,一行变多行,然后再跟B表join,此时要拆分A表,就想到了explode函数的一行变多行功能,但只有explode函数还不够,只能实现将ordr_set中的ordr_id拆成多行,却不允许直接与user_id、user_layer相连。

        也就是用如下语句会报错,因为explode函数的使用存在某些限制,不允许在select中出现其他表达式。

          select user_id 
          ,user_layer
                ,explode(ordr_set) as ordr_id 
          from A  -- 报错 不可这样写

          此时explode便需要lateral view来拯救!帮助它解除限制!

          Lateral view通常与生成器函数结合使用,比如explode,生成包含一行或多行的虚拟表。

            select user_id -- 原字段
            ,user_layer -- 原字段
                  ,ordr_id -- 拆分字段
            from A
            lateral view explode(ordr_set)tmp1 as ordr_id

            使用lateral view explode就可以实现ordr_set中的ordr_id与相应的user_id、user_layer多行拆分了,其中tmp1是虚拟表的表名,ordr_id是ordr_set拆分后的字段。

            使用lateral view的时候需要注意的几点:

            1. lateral view的位置是from后where条件前;

            2. 生成的虚拟表的表名不可省略;

            3. from后可带多个lateral view;

            4. 如果要拆分的字段有null值,需要使用lateral view outer 替代,避免数据缺失,这个坑我在工作中踩过!

            好了!以上就是本周的一点点分享,基本源于工作,从实践中才能更快地学习、更深刻地记忆。

            ◆ ◆ ◆  ◆ 

            麟哥新书已经在当当上架了,我写了本书:《拿下Offer-数据分析师求职面试指南》,目前当当正在举行活动,大家可以用相当于原价5折的预购价格购买,还是非常划算的:






            数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。


            管理员二维码:

            猜你喜欢

             !原来爬取B站弹幕这么简单

             厉害了!麟哥新书登顶京东销量排行榜!

             笑死人不偿命的知乎沙雕问题排行榜

             用Python扒出B站那些“惊为天人”的阿婆主!

             你相信逛B站也能学编程吗

            文章转载自数据森麟,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论