2016-06-09 132 views
0

我是Spark新手,我很驚訝某些結果不會重新計算,儘管我沒有(至少我不想) )緩存它們,即我必須重新啓動sbt才能看到更新的值。Spark Scala:如何強制Spark重新計算一些結果(不使用緩存)

這裏是代碼中的相關片段:

val df: DataFrame = sqlContext.read.format("jdbc").options(
    Map(
    "url" -> "jdbc:postgresql://dbHost:5432/tests?user=simon&password=password", 
    "dbtable" -> "events") 
).load() 

val cached = df.cache() 

val tariffs = cached.map(row => row.getAs[Int](2)) 

如果我打印tariffs.toDF().mean()我得到正確的平均水平,但如果我我的代碼更改爲:

val tariffs = cached.map(row => 0) 

我沒有看到新平均(0),直到我重新啓動sbt。如何避免這種行爲?

+0

不知道你想達到與'.MAP(行=> 0)'什麼。你只需要創建一個新的'RDD',爲什麼它應該修改任何東西?你如何檢查它? –

+0

我不試圖做任何事情,它只是表明0的RDD [Int]的平均值不是0,而是之前用實際值計算的平均值(即,tariffs.toDF()。mean()output 17.18而不是0)直到我重新啓動sbt。 – Simon

+0

嘗試使用'unpersist()'將其從緩存中移除? –

回答

0

我看不到你的整個代碼,所以我不能肯定回答,但是,如果下面的代碼產生相同的輸出,你應該在https://issues.apache.org/jira/browse/spark

println(cached.map(row => row.getInt(2)).toDF().mean().collect(0)) 
println(cached.map(row => 0).toDF().mean().collect(0)) 

提交錯誤報告然而,如果他們產生不同的輸出那麼很可能您的REPL會話存在問題。

更一般地,以去除緩存的作用,使用

cached.unpersist() 
相關問題