镶木地板过滤器是否应该减少数据读取?

时间:2016-08-31 21:47:22

标签: apache-spark apache-spark-sql parquet

我有一个存储在镶木地板中的数据集,其中包含几个短键字段和一个相对较大(几kb)的blob字段。数据集按key1,key2排序。

message spark_schema {
  optional binary key1 (UTF8);
  optional binary key2;
  optional binary blob;
}

此数据集的一个用例是获取key1,key2的给定谓词的所有blob。我希望镶木地板谓词下推可以通过不从行组中读取blob来帮助很大,其中键上的谓词与零记录匹配。但是,情况似乎并非如此。

对于仅返回2行(600万)中的谓词,此查询:

select sum(length(blob)) from t2 where key1 = 'rare value'

比此查询花费的时间长5倍,并且读取的数据量增加50倍(根据Web UI):

select sum(length(key2)) from t2 where key1 = 'rare value'

镶木地板扫描似乎确实得到了谓词(说explain(),见下文),这些列甚至看起来都是字典编码(见下文)。

镶木地板过滤器下推实际上不允许我们读取更少的数据或我的设置有问题吗?

scala> spark.sql("select sum(length(blob)) from t2 where key1 = 'rare value'").explain()
== Physical Plan ==
*HashAggregate(keys=[], functions=[sum(cast(length(blob#48) as bigint))])
+- Exchange SinglePartition
   +- *HashAggregate(keys=[], functions=[partial_sum(cast(length(blob#48) as bigint))])
      +- *Project [blob#48]
         +- *Filter (isnotnull(key1#46) && (key1#46 = rare value))
            +- *BatchedScan parquet [key1#46,blob#48] Format: ParquetFormat, InputPaths: hdfs://nameservice1/user/me/parquet_test/blob, PushedFilters: [IsNotNull(key1), EqualTo(key1,rare value)], ReadSchema: struct<key1:string,blob:binary>



$ parquet-tools meta example.snappy.parquet 
creator:     parquet-mr (build 32c46643845ea8a705c35d4ec8fc654cc8ff816d) 
extra:       org.apache.spark.sql.parquet.row.metadata = {"type":"struct","fields":[{"name":"key1","type":"string","nullable":true,"metadata":{}},{"name":"key2","type":"binary","nullable":true,"metadata":{}},{" [more]...

file schema: spark_schema 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
key1:        OPTIONAL BINARY O:UTF8 R:0 D:1
key2:        OPTIONAL BINARY R:0 D:1
blob:        OPTIONAL BINARY R:0 D:1

row group 1: RC:3971 TS:320593029 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
key1:         BINARY SNAPPY DO:0 FPO:4 SZ:84/80/0.95 VC:3971 ENC:BIT_PACKED,PLAIN_DICTIONARY,RLE
key2:         BINARY SNAPPY DO:0 FPO:88 SZ:49582/53233/1.07 VC:3971 ENC:BIT_PACKED,PLAIN_DICTIONARY,RLE
blob:         BINARY SNAPPY DO:0 FPO:49670 SZ:134006918/320539716/2.39 VC:3971 ENC:BIT_PACKED,RLE,PLAIN

(重复...)

2 个答案:

答案 0 :(得分:2)

在火花用户列表中向我指出,镶木板中存在一些影响当前版本的spark并最终打破二进制和字符串类型的谓词下推的错误。我的用例按预期使用整数键。已在Parquet 1.8.1中修复。有关详细信息,请参阅PARQUET-251PARQUET-297。 (帽子提示:Robert Kruszewski)。

答案 1 :(得分:0)

现在使用Spark 2.1.0时会显示以下元数据:

creator: parquet-mr version 1.8.1 (build 4aba4dae7bb0d4edbcf7923ae1339f28fd3f7fcf)

撰写新数据时。