如果我尝试缓存巨大的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将只扫描所需的列并自动
调整压缩"
答案 0 :(得分:2)
当我对缓存的
DataFrame
执行查询时,它会执行全表扫描吗?火花将如何索引数据。
虽然可以进行一些小的优化,但Spark根本不会对数据进行索引。因此,在一般情况下,您应该假设Spark将执行完整的数据扫描。
然而,它可以应用早期预测。因此,如果查询仅使用列的子集,则Spark只能访问这些列,这是必需的。 Columnar存储是压缩的理想选择,Spark支持许多压缩方案(RunLengthEncoding
,DictEncoding
,BooleanBitSet
,IntDelta
,LongDelta
)。根据列的类型和计算的统计信息,Spark可以自动选择适当的压缩格式或跳过压缩。
通常,与柱状存储一起使用的压缩方案允许对压缩数据进行查询,而某些(如RLE)可用于有效选择。同时,您可以增加可存储在内存中的数据量,并且无需从磁盘中获取数据即可访问。