2
私はemr-5.2.0を実行しており、1日分に区切られた寄木細工としてS3に1年間のデータを保存しています。私は1ヶ月間クエリを実行すると、Sparkが1ヶ月分のデータをメモリにロードするだけと期待しています。しかし、クラスタのメモリ使用量は、1.7TBの全データをロードしているようです。スパーク&寄木細工のクエリのパフォーマンス
私はこの
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が教えてくれる方法はありますか?
あなたは 'lakeDF.cache()'ステートメントを削除しようとしましたか?変換の最後に(アクションを呼び出す前に) 'df.explain()'で与えられた物理プランexを調べてみてください。 –
はい 'lakeDF.cache()'が問題でした。 – jspooner