2017-07-29 3 views
3

スパークキャッシングの動作とちょっと混乱しています。2.0.2と2.1.1のスパークキャッシングの違い

val spark = SparkSession.builder().appName("test").master("local[4]").getOrCreate() 
import spark.implicits._ 
val a = spark.createDataset(Seq(("a", 1), ("b", 2), ("c", 3))) 
a.createTempView("a") 
a.cache 
println(s"Is a cached: ${spark.catalog.isCached("a")}") 
val b = a.filter(x => x._2 < 3) 
b.createTempView("b") 
// calling action 
b.cache.first 
println(s"Is b cached: ${spark.catalog.isCached("b")}") 

spark.catalog.uncacheTable("a") 
println(s"Is b cached after a was unpersisted: ${spark.catalog.isCached("b")}") 

火花を使用すると、期待どおりに動作します2.0.2:

Is a cached: true 
Is b cached: true 
Is b cached after a was unpersisted: true 
を - 私は依存データセット(B)を、計算したいキャッシュそれとunpersistソースデータセットは、(a)はここに私のコードです

しかし、2.1.1に:

Is a cached: true 
Is b cached: true 
Is b cached after a was unpersisted: false 

は、どのように私は2.1.1で同じ動作をarchieveことができますか?

ありがとうございます。

答えて

1

私はそれがどのようにすべきかわかりません。テストによると、Spark 2.1.1では期待どおり動作しますが、いくつかの疑問を反映するコメントがいくつかあります。この状況を明確にするために、SparkプロジェクトでJIRAを開くことができます。

CachedTableSuite.scala

test("uncaching temp table") { 
    testData.select('key).createOrReplaceTempView("tempTable1") 
    testData.select('key).createOrReplaceTempView("tempTable2") 
    spark.catalog.cacheTable("tempTable1") 

    assertCached(sql("SELECT COUNT(*) FROM tempTable1")) 
    assertCached(sql("SELECT COUNT(*) FROM tempTable2")) 

    // Is this valid? 
    spark.catalog.uncacheTable("tempTable2") 

    // Should this be cached? 
    assertCached(sql("SELECT COUNT(*) FROM tempTable1"), 0) 
} 

assertCached方法チェックnumCachedTables第2引数と等しいです。

QueryTest.scala

/** 
* Asserts that a given [[Dataset]] will be executed using the given number of cached results. 
*/ 
def assertCached(query: Dataset[_], numCachedTables: Int = 1): Unit = { 
    val planWithCaching = query.queryExecution.withCachedData 
    val cachedData = planWithCaching collect { 
    case cached: InMemoryRelation => cached 
    } 

    assert(
    cachedData.size == numCachedTables, 
    s"Expected query to contain $numCachedTables, but it actually had ${cachedData.size}\n" + 
    planWithCaching) 
} 
+1

はい、スパーク人は、これは「設計によって行動であると言う - https://issues.apache.org/jira/browse/SPARK-21478。それはもはや必要ではない大容量のキャッシュデータセットをどう扱うべきか明確ではありません。何か案は? – yanik1984