2017-03-06 56 views
2

我正在運行emr-5.2.0,並且在S3中存儲了一年的數據,作爲Parquet按日劃分。查詢一個月時,我期望Spark只能將一個月的數據加載到內存中。但是,我的羣集內存使用情況看起來像我正在加載全年的1.7TB數據。Spark&Parquet查詢性能

Spark Memory Usage

我假設我可以加載完整數據湖這樣

val lakeDF = spark.sqlContext.read.parquet("s3://mybucket/mylake.parquet") 
lakeDF.cache() 
lakeDF.registerTempTable("sightings") 

而且火花將使用日期查詢,只選擇符合那裏有過濾器,分區。

val leftDF = spark.sql("SELECT * FROM sightings WHERE DATE(day) BETWEEN "2016-01-09" AND "2016-01-10"") 
val audienceDF = leftDF.join(ghDF, Seq("gh9")) 
audienceDF.select(approxCountDistinct("device_id", red = 0.01).as("distinct"), sum("requests").as("avails")).show() 

我很好奇,如果將分區轉換爲DATE導致此問題?

我也一直在使用Athena/PrestoDB在同一數據集上進行一些測試,並且很清楚,只有幾千兆字節的數據正在被掃描。

有沒有什麼辦法讓Spark在提交查詢之前告訴我要裝入多少數據?

+1

您是否嘗試刪除'lakeDF.cache()'語句?你感冒了也研究'df.explain()'在轉換結束時(在調用動作之前)給出的物理計劃,也許這會給你一個提示 –

+0

是'lakeDF.cache()'是問題。 – jspooner

回答

1

該問題是由於在應用過濾器之前調用lakeDF.cache()造成的。