Как пересечение двух MapReduce привести - PullRequest
0 голосов
/ 03 декабря 2018

Мне нужно найти одинаковые слова в двух файлах.Я использую искру, Java.

Задача: Для двух текстовых файлов подсчитать количество слов, которые встречаются одновременно в первом и во втором файле.Результат сохраняется в файле в виде пар ключ-значение, где ключ - это число общих слов, значение - само слово.

вопрос: как это сделать правильно?Сначала я нахожу слова и количество вхождений этого слова в первом файле, используя wordcount, аналогично второму файлу.Как объединить их, оставляя только общее между первым и вторым?

Я присоединяюсь к ним и получаю вот это: (test, (1,1)) (spark, (1,2))

Мне нужно получить как минимум два значения, т.е. (тест, 1) (искра, 1)

Как это сделать правильно?

Мой код редактирования

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

это scala, но должно быть достаточно просто для перевода на Java:

val f1 = spark.sparkContext.textFile("file1")
val w1 = f1.flatMap(_.split(" ")).toDF().distinct()
val f2 = spark.sparkContext.textFile("file2")
val w2 = f2.flatMap(_.split(" ")).toDF().distinct()
val result = w1.join(w2,w1("value")===w2("value"))
0 голосов
/ 04 декабря 2018

Если у вас есть (слово, количество) в двух фреймах данных df1 и df2, вы можете использовать внутреннее соединение.В искровых соединениях по умолчанию используются внутренние эквайоины, что-то вроде

df1.join(df2, Seq("word"))

сделает свое дело (это зависит от того, как вы назвали слово / число из df1 и df2, вам может потребоваться переименовать некоторые из столбцов).

...