pyspark中的reduceByKey()和takeOrdered():如何提高字数统计任务的性能?

时间:2019-02-17 21:29:18

标签: python pyspark word-count

我有单词计数代码,在大文本语料库上运行非常慢,并挤进了我的计算机。我做了一些分析,发现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中进行编码的人可能是一个琐碎的问题,但是...有什么方法可以修改此代码来解决此问题?

0 个答案:

没有答案