Hive:LATERAL VIEW 使用总结

5 篇文章 0 订阅
4 篇文章 0 订阅

The LATERAL VIEW clause is used in conjunction with generator functions such as EXPLODE, which will generate a virtual table containing one or more rows. LATERAL VIEW will apply the rows to each original output row.

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

LATERAL VIEW Clause - Spark 3.2.0 Documentation (apache.org)

使用案例一(单个LATERAL VIEW):split + explode + LATERAL VIEW

求出每个技能对应的最大的用户的年龄

表和数据

user_iduser_nameageskills
1356kyle23Hadoop-Hive-Spark
1357Jack22Hadoop-Hive
1358Sam26Mysql-Oracle
1359Lucy28Redis-Mysql
1360Rose32Hadoop-Hive-Spark-Flink-Hbase
1361Herry25Flink-Hbase-ClickHouse-Kafka
1362Kelly27Spark-Flink-Hbase
cache table user_info
select '1356' user_id, 'kyle' user_name, 23 age, 'Hadoop-Hive-Spark'  skills
union
select '1357' user_id, 'Jack' user_name, 22 age, 'Hadoop-Hive' skills
union
select '1358' user_id, 'Sam' user_name, 26 age, 'Mysql-Oracle'  skills
union
select '1359' user_id, 'Luc' user_name, 28 age, 'Redis-Mysql' skills
union
select '1360' user_id, 'Rose' user_name, 32 age, 'Hadoop-Hive-Spark-Flink-Hbase' skills
union
select '1361' user_id, 'Harry' user_name, 25 age, 'Flink-Hbase-ClickHouse-Kafka'  skills
union
select '1362' user_id, 'Kelly' user_name, 27 age, 'Spark-Flink-Hbase' skills;

需求分析

先从 skills 字段把每个技能分割出来,然后按照 user_idskills 字段分组,求出最大的年龄

with t1 as (
    -- 对 skills 字段进行切割并实现列转行
    select user_id,
           user_name,
           age,
           skill
    from user_info
    lateral view explode(split(skills,'-')) skill_table as skill
),
     t2 as (
     -- 按照 skill 分组 age 排序,为了标记每个技能对应的最大的用户信息
     select *,
            row_number() over(partition by skill order by age desc) rn
     from t1
)

select
       user_id,
       user_name,
       age,
       skill
from t2
where rn = 1;

在这里插入图片描述

使用案例二(多个LATERAL VIEW):explode + LATERAL VIEW

skillsmark 字段全部转为列

表和数据

user_iduser_nameageskillsmark
1356kyle23[“Hadoop”,“Hive”,“Spark”][“A”, “B”, “C”]
1357Jack22[“Hadoop”,“Hive”][“A”, “D”, “E”]
1358Sam26[“Mysql”,“Oracle”][“B”, “C”]
1359Lucy28[“Redis”,“Mysql”][“D”, “E”]

需求分析

由于 skillsmark 字段全部都是 Array<String> 类型,所以可以直接使用 explode 函数处理

select 
    user_id,
    user_name,
    age,
    skill,
    mark
FROM baseTable
LATERAL VIEW explode(skills) view1 AS skill
LATERAL VIEW explode(mark) view2 AS mark;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hive SQL中,使用Lateral View可以将一个表的一列拆分成多行,以便进行更复杂的查询和分析。在Lateral View中,最常用的函数是posexplode和explode。 在引用中的例子中,使用Lateral View posexplode函数将id列按逗号分隔拆分成多行,同时生成了一个新的列single_id_index和single_id。 在引用中的例子中,使用了两次Lateral View posexplode函数和where子句进行筛选。首先,将id列按逗号分隔拆分成多行,并生成新的列single_id_index和single_id。然后,将tim列按逗号分隔拆分成多行,并生成新的列single_yim_index和single_tim。最后,使用where条件将single_id_index和single_yim_index相等的行筛选出来。 在引用中的例子中,使用Lateral View explode函数将ordr_set表中的ordr_id列拆分成多行,并将每一行与相应的user_id和user_layer进行拆分。tmp1是虚拟表的表名,ordr_id是拆分后的字段。 因此,Lateral ViewHive SQL中是一种非常有用的函数,可以帮助我们处理包含多值的列,并进行更复杂的查询和分析。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Hive SQL中的 lateral view 与 explode(列转行)以及行转列](https://blog.csdn.net/qq_42374697/article/details/115273726)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [Hive SQL中的lateral view explode](https://blog.csdn.net/weixin_38753213/article/details/115364880)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值