2016-05-03 19 views
2

私は非常に大きなDataframeを持つスパークアプリケーションを持っています。私は現在tempTableとしてデータフレームを登録しているので、いくつかのクエリを実行することができます。Spark DataFrame Cache Large TempTable

私はRDDを使用しているときに、persist(StorageLevel.MEMORY_AND_DISK())を使用して、tempTableに相当するものを使用します。

以下の2つの可能性があります。cacheTableがメモリにキャッシュしようとしていて、テーブルが大きすぎてメモリに収まらないため、オプション2が機能しないと思われます。

データをリロードしなくても、いくつかのクエリを実行できるようにするにはどうすればよいでしょうか。

おかげで、 ネイサン

答えて

0

私はちょうどスパーク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