2016-02-07 2 views
0

У меня есть огромный текстовый файл статей в википедии, каждая строка файла - одна статья. Я пытаюсь создать RDD, который будет состоять из массивов строк, каждый массив будет представлять строку текстового файла (полную статью), тогда я хочу подсчитать частоту слов каждого массива, чтобы в конце я получил:Pyspark, выполнять подсчет слов в RDD, состоящий из массивов строк.

[[Article1 слова-частотные кортежи], [слова-Статья 2 частотные кортежи], ...]

Я создаю РДД:

corpus = sc.textFile("articles.txt") 

Тогда я плоскую карту, чтобы разделить в отличие массивы строк

docs = corpus.flatMap(lambda doc: [doc.split(' ')]) 

Если я пытаюсь сделать вторую карту для того, чтобы создать пары слово-значение («слово», 1) следующим образом:

docs.map(lambda word: (word,1)) 

Я получаю пару статья-значение, это было бы полезно, если бы я хотел чтобы подсчитать количество статей в корпусе, как я могу подсчитать слова в каждой статье?

Я думаю, обращаясь к каждому массиву в РДУ и выполнения снижения на этом конкретном массиве каждый раз, когда я попытался

docs.map(lambda word: (word[0],1))) 

но это только получает первую строку каждого массива. Любые предложения более чем приветствуются! большое спасибо!!!!

ответ

1

Один из способов добиться того, что вы хотите, чтобы бросить закрывающий список из flatMap:

from operator import add 

docs = corpus.flatMap(lambda doc: doc.split(' ')) 
docs.map(lambda word: (word,1)).reduceByKey(add) 

Вы также можете flatMap парам непосредственно:

corpus.flatMap(lambda doc: [(x, 1) for x in doc.split(' ')]).reduceByKey(add) 

или испускают частичные агрегаты с Counter:

from collections import Counter 

corpus.flatMap(lambda doc: Counter(doc.split(' ')).items()).reduceByKey(add) 
+0

Отлично! Большое спасибо!! – Artemis