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



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

[

[文章 1 词-频率元组] , [文章 2 词-频率元组], ...

]

我创建RDD:

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

然后我做一个平面映射来拆分为不同的字符串数组

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

如果我尝试做第二个 Map 以这样创建单词-值对("单词",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)

最新更新