import findspark #pip install findspark
findspark.init()
from pyspark import SparkConf,SparkContext
conf = SparkConf().setMaster('local').setAppName('Life_of_Pi')
sc = SparkContext(conf = conf)
text_file = sc.textFile('Life_of_Pi.txt') #见附件下载
wc = text_file.flatMap(lambda line:line.split())\
.map(lambda word: (word,1))\
.reduceByKey(lambda a,b: a+b)
wc.count()
值为17366,但是我们这样处理之后会存在大小写和标点符号的问题。我们接下来这样处理:
import re
def normalizeWords(text):
return re.compile(r'\W+',re.UNICODE).split(text.lower())
#定义一个函数,应用于每一个item
wc_1 = text_file.flatMap(normalizeWords)\ #这里通过定义的函数normalizeWords处理大小写和标点符号
.map(lambda word: (word,1))\
.filter(lambda x: x[0])\ #这里处理空格
.reduceByKey(lambda a,b: a+b)
wc_1.count()
此时我们可以看到值为9977。
如果们还需要按照词频大小排序,我们可以这样处理:
wc_1 = text_file.flatMap(normalizeWords)\
.map(lambda word: (word,1))\
.filter(lambda x: x[0])\
.reduceByKey(lambda a,b: a+b)
wcSorted = wc.map(lambda x: (x[1],x[0])).sortByKey(ascending=False) #交换单词和词频的位置,按词频大小排序
results = wcSorted.collect()
#results
for result in results:
count = str(result[0])
print(result[1] + ':\t' + count)
部分结果如下:
the: 5543
I: 3150
a: 2928
of: 2781
and: 2690
to: 2390
was: 2032
in: 1488
…………