scala Spark получает первые слова в каждой строке массива

Я не могу найти верхнее слово в массиве int и Strings.

См. Приведенный ниже массив и требуемый вывод: Считайте, что n является RDD, и предложите мне Требуемые функции для получения вывода.

scala> n.take(10)
res3: Array[(Int, String)] = Array((4,Hi how are you ,how), (2,hello good good to hear good))

O / P: Array ((4, how), (2, good)) // как верхнее слово в I строке .. хорошо - это верхнее слово во второй строке.

мы можем использовать следующий код, чтобы получить только самые лучшие слова, но я хотел, чтобы в каждой строке я хотел получить верхнее слово.

val msg = n.map{case(val1, val2) => (val2).mkString("")}
val words =msg.flatMap(x => x.split(" "))
val result = words.map(x => (x, 1)).reduceByKey((x, y) => x + y)
val sortReuslts=result.sortBy(x => (-x._2,x._1))

Спасибо :)


person MapReddy Usthili    schedule 10.02.2015    source источник


Ответы (1)


Давайте сначала создадим функцию, чтобы найти слово с максимальной частотой в заданном тексте:

def findMaxFrequencyWord(text: String): (String, Int) = {
    text.split("\\W+")
        .map(x => (x, 1))
        .groupBy(y => y._1)
        .map{ case (x,y) => x -> y.length }
        .toArray
        .sortBy(x => -x._2)
        .head 
}

findMaxFrequenceWord("hi, how are you, how")
> (how, 2)

Создать rdd из (Int, String):

val arr = Array((4, "how how ok"), (3, "i see, you see"), (5, "fine, it is fine"))

val n = sc.parallelize(arr)  

Найдите максимальное частое слово в каждой строке в rdd:

val result = n.map{ case (x, y)  => x -> findMaxFrequencyWord(y)._1 }

result.take(3)

> Array[(String, Int)] = Array((4, how), (3, see), (5, fine))
person Shyamendra Solanki    schedule 10.02.2015
comment
Спасибо, @ Shyamendra Solanki. Очень полезно ... Всего один быстрый вопрос. Если я хочу топ-N тем, какой метод я должен использовать, я пробовал ... взять (n), это не дано ... Пожалуйста, предложите мне ... Еще раз спасибо за быстрый отклик :) - person MapReddy Usthili; 10.02.2015
comment
@MapReddy, если вам нужны первые N терминов, замените head на take(N) после sortBy, предполагая, что в каждой строке всегда будет не менее N разных слов. - person Shyamendra Solanki; 11.02.2015
comment
Спасибо - @ Shyamendra Solanki - person MapReddy Usthili; 13.02.2015