dim*_*ser 5 sql arrays explode hiveql apache-spark
在 Spark 中,对于以下用例,我想了解使用INLINE和EXPLODE之间的主要区别是什么......我不确定是否有任何性能影响,或者一种方法是否优于另一种方法或者如果有任何其他用例,其中一个合适而另一个不合适......
用例是从复杂数据类型(结构数组)中选择 2 个字段,我的直觉是使用 INLINE,因为它会分解结构数组
例如:
WITH sample AS (
SELECT 1 AS id,
array(NAMED_STRUCT('name', 'frank',
'age', 40,
'state', 'Texas'
),
NAMED_STRUCT('name', 'maria',
'age', 51,
'state', 'Georgia'
)
)
AS array_of_structs
),
inline_data AS (
SELECT id,
INLINE(array_of_structs)
FROM sample
)
SELECT id,
name AS person_name,
age AS person_age
FROM inline_data
Run Code Online (Sandbox Code Playgroud)
并使用横向视图爆炸:
WITH sample AS (
SELECT 1 AS id,
array(NAMED_STRUCT('name', 'frank',
'age', 40,
'state', 'Texas'
),
NAMED_STRUCT('name', 'maria',
'age', 51,
'state', 'Georgia'
)
)
AS array_of_structs
)
SELECT id,
person.name,
person.age
FROM sample
LATERAL VIEW EXPLODE(array_of_structs) exploded_people as person
Run Code Online (Sandbox Code Playgroud)
文档清楚地说明了每一个的作用,但我想更好地了解何时选择一个而不是另一个。
EXPLODEUDTF 将生成结构行(结构类型的单列),并获取您需要使用的人名person.name:
WITH sample AS (
SELECT 1 AS id,
array(NAMED_STRUCT('name', 'frank',
'age', 40,
'state', 'Texas'
),
NAMED_STRUCT('name', 'maria',
'age', 51,
'state', 'Georgia'
)
)
AS array_of_structs
)
SELECT id,
person.name,
person.age
FROM sample
LATERAL VIEW explode(array_of_structs) exploded_people as person
Run Code Online (Sandbox Code Playgroud)
结果:
id,name,age
1,frank,40
1,maria,51
Run Code Online (Sandbox Code Playgroud)
并且INLINEUDTF 将生成一个具有 N 列的行集(N = 结构中顶级元素的数量),因此您不需要使用点表示法,person.name因为name其他结构元素已通过INLINE以下方式提取:
WITH sample AS (
SELECT 1 AS id,
array(NAMED_STRUCT('name', 'frank',
'age', 40,
'state', 'Texas'
),
NAMED_STRUCT('name', 'maria',
'age', 51,
'state', 'Georgia'
)
)
AS array_of_structs
)
SELECT id,
name,
age
FROM sample
LATERAL VIEW inline(array_of_structs) exploded_people as name, age, state
Run Code Online (Sandbox Code Playgroud)
结果:
id,name,age
1,frank,40
1,maria,51
Run Code Online (Sandbox Code Playgroud)
这两个INLINE和EXPLODE是UDTFs,需要LATERAL VIEW在蜂巢。在 Spark 中,它在没有横向视图的情况下工作正常。唯一的区别是EXPLODE返回数组元素的数据集(在您的情况下INLINE为 struct )并用于获取已提取的结构元素。您需要在 INLINE 的情况下定义所有结构元素,如下所示:LATERAL VIEW inline(array_of_structs) exploded_people as name, age, state
从性能角度来看,INLINE 和 EXPLODE 的工作方式相同,您可以使用 EXPLAIN 命令来检查计划。在 UDTF 中或在 UDTF 之后提取结构元素不会影响性能。
INLINE 需要描述所有结构元素(在 Hive 中)而 EXPLODE 不需要,因此,如果您根本不需要提取元素,则爆炸可能更方便,如果您不需要提取所有结构元素。当您需要提取全部或大部分结构元素时,INLINE 很方便。
您的第一个代码示例仅适用于 Spark。在 Hive 2.1.1 中,它会因为lateral view需要而引发异常。
在 Spark 中,这也适用:
inline_data AS (
SELECT id,
EXPLODE(array_of_structs) as person
FROM sample
)
Run Code Online (Sandbox Code Playgroud)
要获得年龄列,您需要使用 person.age
| 归档时间: |
|
| 查看次数: |
1852 次 |
| 最近记录: |