Spark - группировка и подсчет по одинаковым строкам (Scala или Pyspark) - PullRequest
0 голосов
/ 11 июня 2018

У меня есть около 15 миллионов строк в DataFrame, которые мне нужно проанализировать.То, что я хотел бы сделать, это сгруппировать их в сходство строк.Конечная цель - подсчитать похожие строки, чтобы получить статистику.Вот пример типа строк:

Apple
Banana
Tilamook Butter
Gala Apple
Pinto Beans
Salt
Granny Smith Apple
Generic Butter
Butter
Black Beans
Beans

Моя группировка будет выглядеть примерно так:

Apple
Gala Apple
Granny Smith Apple
Banana
Tilamook Butter
Generic Butter
Butter
Pinto Beans
Black Beans
Beans
Salt

И счет будет:

Apple - 3
Banana - 1
Butter - 3
Beans - 3
Salt- 1

Я провел некоторые исследования в области кластеризации, но не смог найти хороший пример для такого типа проблем.

Редактировать: Кроме того, мы должны принять во внимание, что эти строки могут быть написаны неправильно, например,

Butter
Bttr
Beans
Bean
Salad
Salat

1 Ответ

0 голосов
/ 11 июня 2018

Вы можете сделать это, используя spark и Scala.сохраните данные в файл и создайте RDD, используя sparkContext, как показано ниже.Примечание: sc представляет sparkContext

val stringsRDD=sc.textFile("C:\\spark\\programs\\strings.txt")

stringsRDD - это СДП строк, теперь вы можете перебирать каждую строку и разбивать ее на слова

val wordsRDD=stringsRDD.flatMap(str=>str.split(" "))

WordsRDD содержит

res3: Array[String] = Array(Apple, Banana, Tilamook, Butter, Gala, Apple, Pinto, Beans, Salt, Granny, Smith, Apple, Generic, Butter, Butter, Black, Beans, Beans)

Создайте простую карту, где ключ - это слово, а значение - 1

val wordMapRDD=wordsRDD.map(word=>(word->1))

WordMapRDD содержит

res4: Array[(String, Int)] = Array((Apple,1), (Banana,1), (Tilamook,1), (Butter,1), (Gala,1), (Apple,1), (Pinto,1), (Beans,1), (Salt,1), (Granny,1), (Smith,1), (Apple,1), (Generic,1), (Butter,1), (Butter,1), (Black,1), (Beans,1), (Beans,1))

Теперь вы можете легко применить reduceByKey функцию

val wordCountRDD=wordMapRDD.reduceByKey(_+_)

wordCountRDD содержит

res5: Array[(String, Int)] = Array((Tilamook,1), (Butter,3), (Salt,1), (Pinto,1), (Apple,3), (Gala,1), (Black,1), (Generic,1), (Granny,1), (Beans,3), (Smith,1), (Banana,1))

Примечание. Если вы хотите увидеть, что содержится в СДР, вы должны использовать метод collect, как показано ниже

wordsRDD.collect
...