在镶木地板的地图类型列上使用 spark-sql 过滤下推

Posted

技术标签:

【中文标题】在镶木地板的地图类型列上使用 spark-sql 过滤下推【英文标题】:filter pushdown using spark-sql on map type column in parquet 【发布时间】:2016-06-21 08:16:33 【问题描述】:

我正在尝试以嵌套方式将我的数据存储在镶木地板中,并使用地图类型列将复杂对象存储为值。

如果有人可以让我知道过滤器下推是否适用于地图类型的列。例如下面是我的 sql 查询 -

`select measureMap['CR01'].tenorMap['1M'] from RiskFactor where businessDate='2016-03-14' and bookId='FI-UK'`

measureMap 是一个映射,键为字符串,值作为自定义数据类型,包含 2 个属性 - 字符串和另一个字符串映射,双精度对。

我想知道下推是否适用于地图,即如果地图有 10 个键值对,Spark 会将整个地图的数据存储在内存中并创建对象模型,或者它会根据 I 处的键过滤掉数据/O 读取级别。

我还想知道是否有任何方法可以在 where 子句中指定键,例如 - where measureMap.key = 'CR01' ?

【问题讨论】:

我认为自从提出这个问题以来,spark 为嵌套(结构)实现了下推谓词,但我相信它不适用于映射类型 issues.apache.org/jira/browse/SPARK-17636 【参考方案1】:

简短的回答是不。Parquet 谓词下推不适用于 mapType 列或嵌套 parquet 结构。 Spark 催化剂优化器仅了解 parquet 数据中的***列。它使用列类型、列数据范围、编码等最终生成查询的整个阶段代码。 当数据采用 MapType 格式时,无法从列中获取此信息。您可以在一个映射中拥有数百个键值对,这在当前的 spark 基础架构中是不可能进行谓词下推的。

【讨论】:

以上是关于在镶木地板的地图类型列上使用 spark-sql 过滤下推的主要内容,如果未能解决你的问题,请参考以下文章

如何在镶木地板文件中使用 K-means

Spark - 如果已经存在,则更新记录(在镶木地板文件中)

火花数据框密封特征类型

AWS Redshift:如何存储大小大于 100K 的文本字段

使用 pyspark 比较镶木地板文件的元数据

Spark - 结构值的 Hive 集成 - NULL 输出