2
我正在运行emr-5.2.0,并且在S3中存储了一年的数据,作为Parquet按日划分。查询一个月时,我期望Spark只能将一个月的数据加载到内存中。但是,我的群集内存使用情况看起来像我正在加载全年的1.7TB数据。Spark&Parquet查询性能
我假设我可以加载完整数据湖这样
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()'在转换结束时(在调用动作之前)给出的物理计划,也许这会给你一个提示 –
是'lakeDF.cache()'是问题。 – jspooner