缓存查询性能Spark

时间:2017-08-14 19:23:24

标签: apache-spark apache-spark-sql

如果我尝试缓存巨大的DataFrame(例如:100GB表),当我对缓存的DataFrame执行查询时,它会执行全表扫描吗?火花将如何索引数据。 Spark文档说:

  

Spark SQL可以使用内存中的列式格式来缓存表   调用spark.catalog.cacheTable(" tableName")或dataFrame.cache()。   然后,Spark SQL将仅扫描所需的列并自动进行扫描   调整压缩以最小化内存使用和GC压力。您可以   调用spark.catalog.uncacheTable(" tableName")从中删除表   存储器中。

http://spark.apache.org/docs/latest/sql-programming-guide.html#caching-data-in-memory

我没有完全理解上述陈述,如果有人详细解释下面的陈述或如何优化大型缓存数据框的查询,那将会非常有用

  

"然后Spark SQL将只扫描所需的列并自动

     
    

调整压缩"

  

1 个答案:

答案 0 :(得分:2)

  

当我对缓存的DataFrame执行查询时,它会执行全表扫描吗?火花将如何索引数据。

虽然可以进行一些小的优化,但Spark根本不会对数据进行索引。因此,在一般情况下,您应该假设Spark将执行完整的数据扫描。

然而,它可以应用早期预测。因此,如果查询仅使用列的子集,则Spark只能访问这些列,这是必需的。

Columnar存储是压缩的理想选择,Spark支持许多压缩方案(RunLengthEncodingDictEncodingBooleanBitSetIntDeltaLongDelta)。根据列的类型和计算的统计信息,Spark可以自动选择适当的压缩格式或跳过压缩。

通常,与柱状存储一起使用的压缩方案允许对压缩数据进行查询,而某些(如RLE)可用于有效选择。同时,您可以增加可存储在内存中的数据量,并且无需从磁盘中获取数据即可访问。