来自Spark的官方文档,它说:
Spark SQL 可以使用内存中列格式缓存表: 调用 sqlContext.cacheTable("tableName"( 或 dataFrame.cache((。然后 Spark SQL 将仅扫描所需的列,并将自动调整 压缩以最大程度地减少内存使用量和 GC 压力。你可以打电话 sqlContext.uncacheTable("tableName"( 从内存中删除表。
使用内存中列式格式缓存表的真正含义是什么?把整个表放进内存里?众所周知,缓存也是懒惰的,表在对查询执行第一个操作后缓存。如果选择不同的操作或查询,对缓存表有什么影响吗?我已经用谷歌搜索了几次这个缓存主题,但未能找到一些详细的文章。如果有人能为这个主题提供一些链接或文章,我将不胜感激。
http://spark.apache.org/docs/latest/sql-programming-guide.html#caching-data-in-memory
是的,如果使用此设置,缓存表会将整个表压缩到内存中:spark.sql.inMemoryColumnarStorage.compressed = true。 请记住,在数据帧上执行缓存时,它是延迟缓存,这意味着它只会缓存下一个处理事件中使用的行。 因此,如果对该数据帧执行查询并且仅扫描 100 行,则只会缓存这些行,而不是整个表。 但是,如果您在SQL中执行CACHE TABLE MyTableName,则默认为预先缓存,并将缓存整个表。 您可以在SQL中选择LAZY缓存,如下所示:
CACHE LAZY TABLE MyTableName