Spark Scala:如何强制Spark重新计算一些结果(不使用其缓存)

时间:2016-06-09 11:39:59

标签: scala caching apache-spark apache-spark-sql

我是Spark的新手,我很惊讶有些结果没有重新计算,虽然我没有(至少我不想)缓存它们,即我必须重新启动sbt以查看更新的值。

以下是相关的代码片段:

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)

在重新启动sbt之前,我没有看到新的平均值(0)。如何避免这种行为?

1 个答案:

答案 0 :(得分:1)

我无法看到您的整个代码,因此我无法确定地回答,但是,如果以下代码生成相同的输出,您应该在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()