如果其他列匹配,则求和一列值

时间:2018-08-14 05:37:59

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

我有一个这样的spark数据框:

word1  word2  co-occur
----   -----  ------- 
 w1     w2      10
 w2     w1      15
 w2     w3      11

我的预期结果是:

word1  word2  co-occur
----   -----  ------- 
 w1     w2      25
 w2     w3      11

我尝试了数据框的groupBy和聚合函数,但是无法提出解决方案。

1 个答案:

答案 0 :(得分:3)

您需要一个包含两个单词(按排序顺序)的列,然后该列可用于groupBy。您可以使用包含word1word的数组创建新列,如下所示:

df.withColumn("words", sort_array(array($"word1", $"word2")))
  .groupBy("words")
  .agg(sum($"co-occur").as("co-occur"))

这将产生以下结果:

 words        co-occur
-----        --------
["w1","w2"]     25
["w2","w3"]     11

如果您想同时使用两个单词作为spearate dataframe列,请在以后使用getItem方法。对于上面的示例,在上面添加以下几行:

df.withColumn("word1", $"words".getItem(0))
  .withColumn("word2", $"words".getItem(1))
  .drop($"words")

最终的结果dataFrame如下所示:

 word1  word2  co-occur
----   -----  ------- 
 w1     w2      25
 w2     w3      11