簡體   English   中英

Spark DataFrame 緩存大型臨時表

[英]Spark DataFrame Cache Large TempTable

我有一個帶有非常大數據框的 spark 應用程序。 我目前正在將數據幀注冊為臨時表,以便我可以對其執行多個查詢。

當我使用 RDD 時,我使用 persist(StorageLevel.MEMORY_AND_DISK()) 什么是臨時表的等價物。

下面是兩種可能性,我不認為選項 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");

我怎樣才能最好地緩存我的臨時表,以便我可以對它執行多個查詢而不必不斷重新加載數據。

謝謝,內森

我剛剛查看了 Spark 1.6.1 源代碼,實際上選項 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 

參考:

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

https://github.com/apache/spark/blob/branch-1.6/sql/core/src/main/scala/org/apache/spark/sql/execution/CacheManager.scala#L76

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM