我有一个巨大的维基百科文章文本文件,文件的每一行都是一篇文章。我正在尝试创建一个由字符串数组组成的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)