我有单词计数代码,在大文本语料库上运行非常慢,并挤进了我的计算机。我做了一些分析,发现reduceByKey()和takeOrdered()是罪魁祸首。请参见下面的示例:
text = [['A', 'B', 'C', 'D', 'E'],
['F', 'E', 'G', 'A', 'B'],
['D', 'E', 'H', 'A', 'B'],
['A', 'B', 'C', 'F', 'E'],
['A', 'B', 'C', 'J', 'E'],
['E', 'H', 'A', 'B', 'C'],
['E', 'G', 'A', 'B', 'C'],
['C', 'F', 'E', 'G', 'A'],
['C', 'D', 'E', 'H', 'A'],
['C', 'J', 'E', 'H', 'A'],
['H', 'A', 'B', 'C', 'F'],
['H', 'A', 'B', 'C', 'J'],
['B', 'C', 'F', 'E', 'G'],
['B', 'C', 'D', 'E', 'H'],
['B', 'C', 'F', 'E', 'K'],
['B', 'C', 'J', 'E', 'H'],
['G', 'A', 'B', 'C', 'F'],
['J', 'E', 'H', 'A', 'B']]
textRDD=sc.text.parallelize()
这是我的字数统计代码:
cacheList = textRDD.flatMap(lambda x: x) \
.map(lambda word: (word,1))\
.reduceByKey(lambda a, b: a + b)\
.takeOrdered(10, key=lambda x: -x[1])
cacheList[:4]
输出:
[('B', 15),
('C', 15),
('E', 15),
('A', 14),
('H', 9),
('F', 7),
('J', 5),
('G', 5)]
我需要将此程序用于更大的文本,但是由于reduceByKey()尤其是takeOrdered()操作,它需要花费很多时间来编写。这是我的时间安排,如下所示: (每个阶段的时间都是前几个阶段的累积时间),例如,阶段“映射”时间将是“映射”的时间+“ reduceByKey”的时间。时间以毫秒为单位。
times = np.array([2.24,4.64,20.4,185.0])
stages =['flatMap','map','reduce','takeOrdered']
plt.plot(stages,times,marker='s',color = 'red')
plt.grid(True)
看起来很糟糕。我的理解是,随着语料库的增加,在进行改组之前,会一次发出太多键值对。我的电脑无法处理它。几个星期前刚刚学会如何在pyspark中进行编码的人可能是一个琐碎的问题,但是...有什么方法可以修改此代码来解决此问题?