我有一个带有非常大的Dataframe的spark应用程序。我目前正在将数据帧注册为tempTable,因此我可以针对它执行多个查询。
当我使用RDD时,我使用persist(StorageLevel.MEMORY_AND_DISK())与tempTable的等价物。
下面是两种可能性,我不认为选项2会起作用,因为cacheTable会尝试在内存中缓存,而我的表太大而无法容纳在内存中。
DataFrame standardLocationRecords = inputReader.readAsDataFrame(sc, sqlc);
// Option 1 //
standardLocationRecords.persist(StorageLevel.MEMORY_AND_DISK());
standardLocationRecords.registerTempTable("standardlocationrecords");
// Option 2 //
standardLocationRecords.registerTempTable("standardlocationrecords");
sqlc.cacheTable("standardlocationrecords");
如何最好地缓存我的temptable,以便我可以执行多次查询而无需继续重新加载数据。
谢谢, 森
答案 0 :(得分:2)
我刚看了Spark 1.6.1源代码,实际上Option 2就是你想要的。以下是缓存评论的摘录:
...与
RDD.cache()
不同,默认存储级别设置为MEMORY_AND_DISK
因为重新计算内存中的列 基础表的表示很昂贵。
def cacheTable(tableName: String): Unit = {
cacheManager.cacheQuery(table(tableName), Some(tableName))
}
private[sql] def cacheQuery(
query: Queryable,
tableName: Option[String] = None,
storageLevel: StorageLevel = MEMORY_AND_DISK): Unit
参考: