火花&镶木地板查询性能

时间:2017-03-06 19:14:22

标签: apache-spark amazon-emr parquet

我正在运行emr-5.2.0并将一年的数据存储在S3中作为Parquet,按日分区。查询一个月后,我希望Spark只将一个月的数据加载到内存中。但是,我的群集内存使用情况看起来像我正在加载全年1.7TB的数据。

Spark Memory Usage

我假设我可以像这样加载完整的数据湖

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

Spark会使用查询中的日期来仅选择与WHERE过滤器匹配的分区。

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 个答案:

答案 0 :(得分:1)

问题是由于在应用过滤器之前调用lakeDF.cache()引起的。