Spark - 两个键值对 RDD 的总和值

Posted

技术标签:

【中文标题】Spark - 两个键值对 RDD 的总和值【英文标题】:Spark - Sum values of two key-value pair RDDs 【发布时间】:2015-07-29 19:08:25 【问题描述】:

我有两个文件AB,其内容如下:

一个

brown i like
big is house
jumps over lazy

B

this is my house
my house is brown
brown is color

我想分别计算每个文件中每个单词的出现次数,然后将结果相加,以获得两个文件中所有单词的计数,即如果一个单词出现在两个文件中,那么它的最终计数将是两个文件中的一些总数。

以下是我目前写的代码:

val readme = sc.textFile("A.txt")
val readmesplit = readme.flatMap(line => line.split(" "))
val changes = sc.textFile("B.txt")
val changessplit = changes.flatMap(line => line.split(" "))

val readmeKV = readmesplit.map(x => (x, 1)).reduceByKey((x, y) => x + y)
val changesKV = changessplit.map(x => (x,1)).reduceByKey((x, y) => x + y)

val ans = readmeKV.fullOuterJoin(changesKV).collect()

这段代码给了我以下输出:

(this,(Some(1),None)), (is,(Some(3),Some(1))), (big,(None,Some(1))),
(lazy,(None,Some(1))), (house,(Some(2),Some(1))), (over,(None,Some(1)))...and so on

现在我如何对每个键的值元组求和以获得两个文件中每个单词的出现次数。

【问题讨论】:

【参考方案1】:

您是否尝试过使用union 而不是fullOuterJoin? :

val ans = readmesplit.union(changessplit).map(x => (x,1)).reduceByKey((x, y) => x + y)

【讨论】:

我必须承认这是一个比我想要的更优雅的解决方案。 如果这是一个更好的解决方案,请随时不接受我的回答 您解决了我面临的问题,这使您的问题成为我问题的正确答案,无论@ccheneson 的答案是谁都是做我一直想做的事情的更好方法。【参考方案2】:
val totals = ans.map 
  case (word, (one, two)) => (word, one.getOrElse(0) + two.getOrElse(0))

只需提取两个值,如果单词不存在则返回 0,然后将结果相加。

【讨论】:

以上是关于Spark - 两个键值对 RDD 的总和值的主要内容,如果未能解决你的问题,请参考以下文章

Learning Spark中文版--第四章--使用键值对

Spark学习笔记3:键值对操作

Scala RDD 反向键值对

6.spark core之键值对操作

Spark入门--Spark的combineByKeysortBykey

Spark RDD常用算子操作 键值对关联操作 subtractByKey, join,fullOuterJoin, rightOuterJoin, leftOuterJoin