2017-03-06 55 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()造成的。