2016-06-09 90 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()