Spark SQL中inline()与inline_outer()的区别及适用场景咨询
Spark SQL中inline()与inline_outer()的差异及选择指南
两者的核心区别完全体现在处理空数组或Null数组的行为上,绝对不能随便混用,具体差异和适用场景如下:
核心行为差异
inline():如果输入的数组字段是空数组([])或者null,这一行会直接被过滤,不会生成任何输出行inline_outer():哪怕数组是空的或者null,原始行依然会被保留,展开后的所有字段值填充为null
用实例看差异
先创建测试数据:
CREATE TEMP VIEW test_data AS SELECT 1 AS id, ARRAY(STRUCT('a' AS col1, 10 AS col2)) AS arr UNION ALL SELECT 2 AS id, ARRAY() AS arr UNION ALL SELECT 3 AS id, NULL AS arr;
执行inline()的结果
SELECT id, inline(arr) FROM test_data;
输出:
| id | col1 | col2 |
|---|---|---|
| 1 | a | 10 |
只有数组有有效内容的行被保留,id=2、3的行直接被过滤
执行inline_outer()的结果
SELECT id, inline_outer(arr) FROM test_data;
输出:
| id | col1 | col2 |
|---|---|---|
| 1 | a | 10 |
| 2 | null | null |
| 3 | null | null |
所有原始行都被保留,空/Null数组对应的展开字段为null
场景选择
- 用
inline():当你只关心有有效数组内容的行,不需要保留空/Null数组的行时 - 用
inline_outer():当你需要完整保留所有原始行,哪怕数组无内容也要对应输出时
内容的提问来源于stack exchange,提问作者Guoran Yun
相关产品推荐
相关产品推荐

