如何使用特定行来修改数据框中的其他行

时间:2017-10-02 13:08:54

标签: scala apache-spark spark-dataframe

给出以下数据框

id | value
1  | 2
2  | 3
3  | 4

我想将所有值除以reference的值:与id 1相关的值

我想出了:

df.cache()

val ref = df
  .filter($"id" === 1)
  .withColumnRenamed("value", "ref")

df
  .crossJoin(broadcast(ref))
  .withColumn("div", $"value" / $"ref)

亲:

  • 避免collect(),因此数据不会发送到spark驱动程序。
  • 使用cache()来避免计算输入DataFrame的2倍。

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

  

使用cache()来避免计算输入DataFrame的2倍。

这不正确。像所有其他spark操作一样的缓存是laze,除非调用某些操作,否则不会评估。所以当你这样做时

val ref = df
 .filter($"id" === 1)
 .withColumnRenamed("value", "ref")

df
.crossJoin(broadcast(ref))
.withColumn("div", $"value" / $"ref) 

最终将同时评估调用save 2操作。如果您确实想立即缓存数据,则需要对缓存数据调用一些操作

df.count
可能是。