2015-07-29 1 views
0

у меня есть два файла и B, содержание которого являются следующим:Spark - Sum значение РДА пар два значения ключа

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
val totals = ans.map { 
    case (word, (one, two)) => (word, one.getOrElse(0) + two.getOrElse(0)) 
} 

Просто извлеките два значения, возвращая 0, если слово отсутствует, и добавьте результат.

2

Вы пытались использовать union вместо fullOuterJoin? :

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

Должен признаться, это намного более элегантное решение, чем то, что я собирался сделать. –

+0

Не стесняйтесь отвечать на мой вопрос, если это лучшее решение. –

+0

Вы столкнулись с проблемой, с которой я столкнулся, что делает ваш правильный ответ на мой вопрос, кто бы ни ответил @ ccheneson, это был лучший способ сделать то, что я решил сделать все это время. –