Parquet谓词下推是否适用于使用Spark非EMR的S3?

时间:2016-01-21 07:35:44

标签: amazon-s3 apache-spark parquet

只是想知道Parquet谓词下推是否也适用于S3,而不仅仅是HDFS。特别是如果我们使用Spark(非EMR)。

进一步的解释可能会有所帮助,因为它可能涉及了解分布式文件系统。

5 个答案:

答案 0 :(得分:6)

我自己也在想这个,所以我只是测试了一下。我们使用 EMR群集 Spark 1.6.1

  • 我在Spark中生成了一些虚拟数据,并在本地和S3上将其保存为镶木地板文件。
  • 我使用不同类型的过滤器和列选择创建了多个Spark作业。我为本地文件运行了一次这些测试,为S3文件运行了一次。
  • 然后我使用Spark History Server查看每个作业输入的数据量。

结果:

  • 对于本地镶木地板文件:结果显示,当作业包含过滤器或列选择时,列选择和过滤器被下推到读取,因为输入大小减小。
  • 对于S3镶木地板文件:输入大小始终与处理所有数据的Spark作业相同。 没有任何过滤器或列选择被下推到读取。镶木地板文件始终从S3完全加载。即使查询计划(.queryExecution.executedPlan)显示过滤器被按下。

我会在有空的时候添加有关测试和结果的更多详细信息。

答案 1 :(得分:2)

是。过滤器下推不依赖于底层文件系统。它只取决于spark.sql.parquet.filterPushdown和过滤器的类型(并非所有过滤器都可以按下)。

请参阅https://github.com/apache/spark/blob/v2.2.0/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFileFormat.scala#L313了解下推逻辑。

答案 2 :(得分:1)

这是我为s3a工作推荐的按键

spark.sql.parquet.filterPushdown true
spark.sql.parquet.mergeSchema false
spark.hadoop.parquet.enable.summary-metadata false

spark.sql.orc.filterPushdown true
spark.sql.orc.splits.include.file.footer true
spark.sql.orc.cache.stripe.details.size 10000

spark.sql.hive.metastorePartitionPruning true
spark.speculation false
spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version 2
spark.hadoop.mapreduce.fileoutputcommitter.cleanup.skipped true

答案 3 :(得分:0)

Spark使用HDFS镶木地板和s3库所以相同的逻辑工作。 (在spark 1.6中,他们为平面图案拼花文件添加了更快的快捷方式)

答案 4 :(得分:0)

最近我在Spark 2.4上进行了尝试,似乎Pushdown谓词可以在s3上使用。

这是spark sql查询:

explain select * from default.my_table where month = '2009-04' and site = 'http://jdnews.com/sports/game_1997_jdnsports__article.html/play_rain.html' limit 100;

这是输出的一部分:

PartitionFilters: [isnotnull(month#6), (month#6 = 2009-04)], PushedFilters: [IsNotNull(site), EqualTo(site,http://jdnews.com/sports/game_1997_jdnsports__article.html/play_ra...

明确指出PushedFilters不为空。

注意:已使用表是在AWS S3之上创建的