2017-08-14 63 views
1

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

星火SQL可以通过 使用缓存在内存中柱状格式表调用spark.catalog.cacheTable(“表名”)或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将只扫描所需列,并将自动调整

调整压缩“

+0

你能提供.explain()方法的查询计划吗? – addmeaning

回答

0

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

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

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

柱状商店是良好候选压缩和火花支持许多压缩方案(RunLengthEncodingDictEncodingBooleanBitSetIntDeltaLongDelta)的。根据列的类型和计算的统计信息,Spark可以自动选择合适的压缩格式或跳过压缩。

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