LATERAL VIEW 使用总结

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 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;
### HiveLATERAL VIEW 的用法 #### 基本概念 `LATERAL VIEW` 是 Hive 提供的一种功能,允许用户通过指定的 UDTF(User Defined Table Generating Function),将复杂的数据结构拆解成多行或多列的形式。它通常与 `EXPLODE` 函数一起使用,用于处理数组或映射等复杂数据类型。 其基本语法如下: ```sql LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)* ``` 其中: - **udtf**: 用户定义的表生成函数,例如 `EXPLODE` 或自定义函数。 - **expression**: 输入到 UDTF 的表达式,通常是复杂的字段(如数组或映射)。 - **tableAlias**: 别名,表示由 UDTF 生成的结果集。 - **columnAlias**: 表示从 UDTF 输出的每一列的名称[^1]。 --- #### 示例说明 假设有一张员工技能评分表 `employees`,其结构如下: | employee_id | employee_name | skill_ratings | |-------------|---------------|-----------------------| | 1 | Alice | {"Java":5, "Python":4} | | 2 | Bob | {"C++":3, "SQL":5} | 目标是从这张表中提取每位员工的具体技能及其对应的评分。 ##### 查询语句 ```sql SELECT employee_id, employee_name, skill, rating FROM employees LATERAL VIEW EXPLODE(skill_ratings) exploded_table AS skill, rating; ``` ##### 结果解释 在此查询中: - `EXPLODE(skill_ratings)` 将 `skill_ratings` 映射中的键值对逐一展开为两列:`skill` 和 `rating`。 - `exploded_table` 是临时表别名,代表经过 `EXPLODE` 处理后的结果。 - 最终输出的是每条记录被分解后的具体技能和对应评分[^4]。 最终结果如下: | employee_id | employee_name | skill | rating | |-------------|---------------|--------|---------| | 1 | Alice | Java | 5 | | 1 | Alice | Python | 4 | | 2 | Bob | C++ | 3 | | 2 | Bob | SQL | 5 | --- #### INNER VS OUTER 差异 除了普通的 `LATERAL VIEW`,还有一种变体叫作 `LATERAL VIEW OUTER`。两者的主要区别在于如何处理无法匹配的情况。 - 当输入为空或者 UDTF 返回空时: - `LATERAL VIEW`: 不会返回任何行。 - `LATERAL VIEW OUTER`: 即使没有匹配项也会保留原始行,并将其扩展部分设置为 NULL[^2]。 ##### 示例对比 假设有以下数据: | id | skills | |-----|---------------| | 101 | ["A", "B"] | | 102 | [] | ###### 使用 `LATERAL VIEW` ```sql SELECT id, skill FROM test_data LATERAL VIEW explode(skills) t AS skill; ``` 结果: | id | skill | |-----|-------| | 101 | A | | 101 | B | 注意:ID=102 被忽略,因为它没有任何技能。 ###### 使用 `LATERAL VIEW OUTER` ```sql SELECT id, skill FROM test_data LATERAL VIEW OUTER explode(skills) t AS skill; ``` 结果: | id | skill | |-----|-------| | 101 | A | | 101 | B | | 102 | NULL | 可以看到,即使 ID=102 没有技能,仍然会被保留并显示为 NULL。 --- #### 总结 `LATERAL VIEW` 是一种强大的工具,能够帮助我们轻松实现复杂数据类型的解析和转换操作。无论是简单的数组还是嵌套的映射结构,都可以借助此特性完成高效的数据处理任务[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值