gpt4 book ai didi

sql - Spark 内联与。横向 View explode 差异?

转载 作者:行者123 更新时间:2023-12-03 16:11:14 24 4
gpt4 key购买 nike

在 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

并使用横向 View explode :
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

文档清楚地说明了每一个的作用,但我想更好地了解何时选择一个而不是另一个。

最佳答案

EXPLODE UDTF 将生成 struct 行(struct 类型的单列),要获取人名,您需要使用 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

结果:
id,name,age
1,frank,40
1,maria,51

INLINE UDTF 将生成具有 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

结果:
id,name,age
1,frank,40
1,maria,51

两者 INLINEEXPLODE是 UDTF 并且需要 LATERAL VIEW在 hive 。在 Spark 中,它在没有横向 View 的情况下工作正常。唯一的区别是 EXPLODE返回数组元素的数据集(在您的情况下为结构)和 INLINE用于获取已提取的结构元素。您需要在 INLINE 的情况下定义所有结构元素,如下所示: LATERAL VIEW inline(array_of_structs) exploded_people as name, age, state
从性能角度来看,INLINE 和 EXPLODE 的工作方式相同,您可以使用 EXPLAIN 命令来检查计划。在 UDTF 中或在 UDTF 之后提取结构元素不会影响性能。

INLINE 需要描述所有结构元素(在 Hive 中)而 EXPLODE 不需要,因此,如果您根本不需要提取元素,则 explode 可能更方便,如果您不需要提取所有结构元素。当您需要提取全部或大部分结构元素时,INLINE 很方便。

您的第一个代码示例仅适用于 Spark。在 Hive 2.1.1 中它会抛出异常,因为 lateral view必需的。

在 Spark 中,这也适用:
inline_data AS (
SELECT id,
EXPLODE(array_of_structs) as person
FROM sample
)

要获得年龄列,您需要使用 person.age

关于sql - Spark 内联与。横向 View explode 差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62053835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com