2016-01-21 23 views

回答

0

是的。過濾器下推不依賴於底層文件系統。它只取決於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下推邏輯。

+1

據艾米莉科廷星火峯會,它依賴於「文件系統」(在這種情況下,對象存儲),因爲S3不支持隨機訪問。 https://youtu.be/_0Wpwj_gvzg?t=1307 – andresp

+0

謝謝!而另一個有爭議的答案也說我錯了。我在Spark 2.2.0中再次查找了代碼,它似乎仍不依賴於文件系統。但它可能間接依賴於它。 –

+2

但S3確實具有隨機訪問權限:http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html#ExampleGetRangeRequestHeaders 而Hortonworks談到S3上的過濾器下推:https://hortonworks.github。 io/hdp-aws/s3-spark/index.html#reading-orc-and-parquet-datasets –

0

Spark使用HDFS實木複合地板& s3庫,所以相同的邏輯工作。 (並且在火花1.6中,他們已經爲平面模式木地板文件添加了更快的快捷鍵)

3

我在想這個,所以我只是測試了一下。我們使用EMR集羣Spark 1.6.1

  • 我在Spark中生成了一些虛擬數據,並將其保存爲本地以及S3上的parquet文件。
  • 我使用不同種類的過濾器和列選擇創建了多個Spark作業。我爲本地文件運行一次這些測試,併爲S3文件運行一次。
  • 然後我使用Spark歷史記錄服務器來查看每個作業有多少數據作爲輸入。

結果:

  • 對於本地拼花文件:結果表明,該列的選擇和過濾器下推到讀爲當作業包含過濾器或列選擇輸入尺寸減小。
  • 對於S3地板文件:輸入大小始終與處理所有數據的Spark作業相同。 沒有任何篩選器或列選擇被下推到讀取。地板文件始終從S3完全加載。即使查詢計劃(.queryExecution.executedPlan)顯示過濾器被推下。

我會在有空的時候添加更多關於測試和結果的細節。

0

這裏的鑰匙我會推薦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 
+0

設置這些值的最佳方法是什麼?我在AWS EMR集羣中使用Spark,並在Scala spark腳本中設置了這些(摘要 - 元數據和算法版本)。我一直使用filterPushdown和mergeSchema作爲Parquet讀/寫的選項。但我想以某種方式擺脫寫入S3的_ $文件夾$文件。 –