Spark DataFrame Cache大型TempTable

时间:2016-05-03 15:13:09

标签: apache-spark dataframe apache-spark-sql rdd

我有一个带有非常大的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,以便我可以执行多次查询而无需继续重新加载数据。

谢谢, 森

1 个答案:

答案 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 

参考:

WestLangley

https://github.com/apache/spark/blob/branch-1.6/sql/core/src/main/scala/org/apache/spark/sql/SQLContext.scala#L355