首页 > 解决方案 > Spark 是否支持结构数组的列扫描修剪

问题描述

我在以下架构中有一个名为“家庭”的数据框:

root
 |-- country_code: string (nullable = true)
 |-- region_code: string (nullable = true)
 |-- individuals: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- individual_id: string (nullable = true)
 |    |    |-- ids: array (nullable = true)
 |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |-- id_last_seen: date (nullable = true)
 |    |    |    |    |-- type: string (nullable = true)
 |    |    |    |    |-- value: string (nullable = true)
 |    |    |    |    |-- year_released: integer (nullable = true)

我可以使用以下代码查找包含至少一台 2018 年后发布的设备的家庭

val sql = """
select household_id
from household
where exists(individuals, id -> exists(id.ids, dev -> dev.year_released > 2018))
"""
val v = spark.sql(sql)

它运行良好,但是,我发现 spark 查询计划器无法修剪不需要的列。该计划表明 Spark 必须读取嵌套结构的所有列

用 spark 2.4.5 和 3.0.0 对此进行了测试,得到了相同的结果。

只是想知道 Spark 是否支持或将添加对结构数组的列扫描修剪的支持?

标签: apache-sparkapache-spark-sql

解决方案


是的。

要激活嵌套模式修剪,您必须在上下文中设置该选项:

spark.conf.set("spark.sql.optimizer.nestedSchemaPruning.enabled", "true")

在此处查看此答案: Efficient reading nested parquet column in Spark


推荐阅读