来自Spark官方document,它说:
Spark SQL可以使用内存中的列式格式来缓存表 调用sqlContext.cacheTable(" tableName")或dataFrame.cache()。然后 Spark SQL将仅扫描所需的列并将自动调整 压缩以最小化内存使用和GC压力。你可以打电话 sqlContext.uncacheTable(" tableName")从内存中删除表。
使用内存中的列式格式缓存表的真正含义是什么? 把整个表放入内存?我们知道缓存也很懒, 在查询的第一个操作之后缓存该表。如果选择不同的操作或查询,它对缓存表有什么影响吗?我已多次用Google搜索此缓存主题,但未能找到一些详细的文章。如果有人能为这个主题提供一些链接或文章,我将非常感激。
http://spark.apache.org/docs/latest/sql-programming-guide.html#caching-data-in-memory
答案 0 :(得分:8)
是的,如果使用此设置,则缓存表会将整个表压缩到内存中:spark.sql.inMemoryColumnarStorage.compressed = true。请记住,在对DataFrame进行缓存时,它是Lazy缓存,这意味着它只会缓存下一个处理事件中使用的行。因此,如果您对该DataFrame执行查询并且仅扫描100行,则只会缓存这些行,而不是整个表。但是,如果在SQL中执行CACHE TABLE MyTableName,则默认为急切缓存并将缓存整个表。您可以在SQL中选择LAZY缓存:
CACHE LAZY TABLE MyTableName