Spark 是不是支持结构数组的列扫描修剪
Posted
技术标签:
【中文标题】Spark 是不是支持结构数组的列扫描修剪【英文标题】:Does Spark support column scan pruning for array of structsSpark 是否支持结构数组的列扫描修剪 【发布时间】:2020-07-20 14:53:24 【问题描述】:我在以下架构中有一个名为“家庭”的数据框:
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 是否支持或将添加对结构数组的列扫描修剪的支持?
【问题讨论】:
您的查询运行缓慢吗?据我所知,修剪只适用于 Spark 中的分区。 速度很慢,因为 Spark 必须读取嵌套结构中的所有列,即使实际上只使用了一个列 您可能需要将 ids 数组规范化为新的数据帧。但是,只有频繁运行 select 语句才值得这样做。 最近的 spark 版本确实支持修剪嵌套列,但仍然不是 100%。你可以试试github.com/taboola/ScORe,可能有用。您也可以手动提供架构。 【参考方案1】:是的。
要激活嵌套模式修剪,您必须在上下文中设置该选项:
spark.conf.set("spark.sql.optimizer.nestedSchemaPruning.enabled", "true")
在此处查看此答案: Efficient reading nested parquet column in Spark
【讨论】:
以上是关于Spark 是不是支持结构数组的列扫描修剪的主要内容,如果未能解决你的问题,请参考以下文章
Spark Streaming:使用带有列修剪的 MicroBatchReader 的模式不匹配
如何展平结构数组类型的列(由 Spark ML API 返回)?
在 spark 数据框中运行 UDF 时,不支持获取 org.apache.spark.sql.Column 类型的架构