Pyspark,在由字符串数组组成的 RDD 中执行字数统计。

Pyspark, perform word count in an RDD comprised of arrays of strings.

我有一个巨大的维基百科文章文本文件,文件的每一行都是一篇文章。我正在尝试创建一个由字符串数组组成的 RDD,每个数组将代表一行文本文件(一篇完整的文章)然后我想计算每个数组的词频所以最后我将有:

[[article1 词频元组],[article2 词频元组],...]

我创建了 RDD:

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

然后我做一个平面图来分割不同的字符串数组

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

如果我尝试做第二个 Map 以这样创建词值对 ("word",1):

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

我得到一个文章值对,如果我想统计语料库中的文章数量,这将很有帮助,我如何计算每篇文章中的单词数?

我想通过引用 RDD 中的每个数组并每次对这个特定数组执行 reduce,我尝试了

docs.map(lambda word: (word[0],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)