为每个字符 pyspark 找到前 100 个单词

finding top 100 words for each character pyspark

我是 spark 的新手,我的任务是从一组推文中为小字母表中的每个字符获取前一百个单词。例如

a: (word1, count1), (word2, count2).. (word100, count100) 
b: (word1, count1), (word2, count2).. (word100, count100) 
.
.
z: (word1, count1), (word2, count2).. (word100, count100)

这是我的代码:

words_mapped = (en_text.flatMap(lambda x: x.split())
                       .filter(lambda x: x[0] in valid_chars )
                       .map(lambda x: (x[0], x)))

这给出了一个包含字符和单词的元组,现在我必须对这些字符进行分组并找到值中每个单词的计数并显示前 100 个单词及其计数。

我怎样才能把它翻译成 pyspark。

Spark 可以轻松聚合(键、值)对。在这里,你有两个阶段——在第一阶段,你的键是 (character, word),然后在第二阶段,你的键是 (character)。 (首先,您需要计算计数;其次,您需要找到最重要的。)

第一个非常简单,使用 reduceByKey (docs)。

words_counted = words_mapped.map( lambda x: (x, 1))
                            .reduceByKey(add)

现在我们需要过滤到前 100 名。这是 Spark 不擅长的,因为它需要一次处理多行。 Scala 有 TopByKey function,但 PySpark 似乎还不支持它。

所以让我们遍历字符(至少只有 26 个)并像这样使用 takeOrdereddocs):

char = 'a'
charRDD = words_counted.filter(lambda x: x[0][0]==char).takeOrdered(100, key=lambda x: -x[1])

然后您可以根据需要连接这些列表。

一些替代方法:使用 partitionBy (docs) to put each group in its own partition, and then mapPartitions (docs) 将每个组的迭代器转换为相关对象(比如,对其进行排序,然后取前 100 个)。

另一种使用foldByKey(docs)的可能性,从一个空列表开始,通过二进制插入将下一个元素添加到列表中,然后删除100之后的任何元素。