Lateral View explode加和不加Outer的区别

上周在写代码时用到了UDTF函数,数据验证时发现漏掉了一些数据,发现是和Outer关键字有关系,直接说结论:
  • 不加Outer关键字,UDTF(比如explode等)所产生的列为空时,原有数据的列不不会展示在结果中;
  • 加outer关键字后,原有数据列正常展示,Lateral View中的列展示为空。

具体case如下(测试引擎:Hive/Tez):

1)样例数据
select * from tmp.temp_cs_01;

结果:
dt       platform	trmnl_tp	data_json_array	
20240114 MINTEGRAL	android		
20240114 MINTEGRAL	android		
20240114 MINTEGRAL	android		
20240114 MINTEGRAL	android		
20240114 MINTEGRAL	android		
20240114 MINTEGRAL	android		
20240114 MINTEGRAL	android		
20240114 MINTEGRAL	android		
20240114 MINTEGRAL	android		
20240114 MINTEGRAL	android	

注:/*data_json_array为空json数组*/

2)不带outer关键字
select 
 a.dt
,a.platform
,a.trmnl_tp
,a.data_json_array
,t.response_rta_id_json
from tmp.temp_cs_01 a
lateral view explode(data_json_array) t AS response_rta_id_json
;

结果:空

3)带outer关键字
select 
 a.dt
,a.platform
,a.trmnl_tp
,a.data_json_array
,t.response_rta_id_json
from tmp.temp_cs_01 a
lateral view outer explode(data_
Hive SQL 中,`LATERAL VIEW OUTER EXPLODE` 是一种用于处理数组或 Map 类型数据的函数,常用于将一行数据中的集合类型字段展开为多行。与普通的 `LATERAL VIEW EXPLODE` 不同,`OUTER` 修饰符确保即使输入集合为空或为 NULL,也会保留原始行,避免数据丢失。 ### 使用语法 ```sql SELECT <columns>, <alias>.<col1>, <alias>.<col2> FROM <table> LATERAL VIEW [OUTER] explode(<array_or_map_col>) <alias> AS <col1>[, <col2>] ``` - `explode(<array_or_map_col>)`: 将数组或 Map 类型的列展开为多个行。 - `LATERAL VIEW OUTER`: 即使 `explode()` 的输入为空或 NULL,也保留原始行。 - `<alias>`: 为生成的虚拟表命名。 - `AS <col1>[, <col2>]`: 定义展开后输出的列名。如果是 Map 类型,`col1` 表示 key,`col2` 表示 value。 ### 示例 假设存在一张表 `students`,其数据如下: | name | subjects | |-------|------------------------| | Alice | ["Math", "Science"] | | Bob | ["History"] | | Carol | NULL | #### 使用 `LATERAL VIEW EXPLODE` ```sql SELECT name, subject FROM students LATERAL VIEW explode(subjects) exploded_table AS subject; ``` 结果: | name | subject | |-------|-----------| | Alice | Math | | Alice | Science | | Bob | History | 注意:`Carol` 的 `subjects` 是 `NULL`,因此在结果中不会出现她的记录。 #### 使用 `LATERAL VIEW OUTER EXPLODE` ```sql SELECT name, subject FROM students LATERAL VIEW OUTER explode(subjects) exploded_table AS subject; ``` 结果: | name | subject | |-------|-----------| | Alice | Math | | Alice | Science | | Bob | History | | Carol | NULL | 可以看到,`Carol` 的记录也被保留,只是 `subject` 为 `NULL`。 ### 与 `posexplode` 的区别 `posexplode()` 除了展开数组外,还会返回元素的索引位置。例如: ```sql SELECT name, pos, subject FROM students LATERAL VIEW posexplode(subjects) exploded_table AS pos, subject; ``` 结果: | name | pos | subject | |-------|-----|-----------| | Alice | 0 | Math | | Alice | 1 | Science | | Bob | 0 | History | ### 适用场景 - **数据展开**:当需要将数组或 Map 类型的字段展开为多行时,使用 `LATERAL VIEW EXPLODE`。 - **保留空值**:当输入字段可能为 `NULL` 或空数组时,使用 `LATERAL VIEW OUTER EXPLODE` 以避免数据丢失。 - **获取索引**:如果需要数组元素的索引信息,使用 `posexplode()`。 ### 注意事项 - `LATERAL VIEW` 必须与 UDTF(用户定义的表生成函数)一起使用,如 `explode()`、`posexplode()`。 - 在 `LATERAL VIEW` 中,`AS` 后的列名必须与函数返回的列数一致。 - `LATERAL VIEW OUTER` 保证即使 `explode()` 没有返回结果,原始行仍然保留在结果集中。 ### 总结 `LATERAL VIEW OUTER EXPLODE` 是 Hive SQL 中处理集合类型数据的重要工具,尤其适用于需要保留空值的场景。通过 `OUTER` 修饰符,确保即使输入为空或 `NULL`,原始行也不会被过滤掉,从而保证数据完整性[^2]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值