【发布时间】:2017-02-10 15:01:00
【问题描述】:
是否为 apache spark 中的缓存 TempTables 启用了分区修剪?如果是这样,我该如何配置?
我的数据是一堆不同安装的传感器读数,一行包含安装名称、标签、时间戳和值。
我已使用以下命令以 parquet 格式写入数据:
rdd.toDF("installationName", "tag", "timestamp", "value")
.repartition($"installationName", $"tag")
.write.partitionBy("installationName","tag").mode("overwrite").parquet(config.output)
我使用以下命令将这些数据读取到使用 Spark HiveContext 的 SQL 表中:
val parquet = hc.read.parquet("/path_to_table/tablename")
parquet.registerTempTable("tablename")
现在,如果我对该表运行 SQL 查询,它会按预期进行分区修剪:
hc.sql("select * from tablename where installationName = 'XXX' and tag = 'YYY'")
查询大约需要 8 秒。但是如果我将表缓存在内存中,然后执行相同的查询,总是需要大约 50 秒:
hc.sql("CACHE TABLE tablename")
hc.sql("select * from tablename where installationName = 'XXX' and tag = 'YYY'")
我目前使用的是 Spark 1.6.1。
【问题讨论】:
-
您好,感谢您的评论。实际上,在将数据写入镶木地板之前,我会进行重新分区操作。我还使用重新分区测试了上述查询,它的查询时间为 20 秒,效率更高,但它仍然比从 parquet 文件中读取而没有缓存要慢。我的目的是完全避免写入镶木地板文件。您能否提供一些来源-您怎么知道缓存后不支持分区修剪?如果你在这里写一个答案,我可以接受。
-
更正,缓存在内存中将查询时间减少到1秒以内,这当然已经可以接受了。我想知道它是否可以扩展:这只是我数据的一部分,我实际上有超过 200 倍并且还在不断增长,所以我拥有的数据越多,扫描所有分区的时间就越多,所以分区修剪在这里似乎是有益的.
标签: caching apache-spark partition pruning hivecontext