2017-03-06 22 views
2

私はemr-5.2.0を実行しており、1日分に区切られた寄木細工としてS3に1年間のデータを保存しています。私は1ヶ月間クエリを実行すると、Sparkが1ヶ月分のデータをメモリにロードするだけと期待しています。しかし、クラスタのメモリ使用量は、1.7TBの全データをロードしているようです。スパーク&寄木細工のクエリのパフォーマンス

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()'で与えられた物理プランexを調べてみてください。 –

+0

はい 'lakeDF.cache()'が問題でした。 – jspooner

答えて

1

この問題は、フィルタが適用される前にlakeDF.cache()を呼び出すことによって発生しています。

関連する問題