Spark / Python,reduceByKey()然后找到前10个最常用的单词和频率

时间:2019-12-08 22:32:12

标签: python apache-spark count tuples

我有一个使用Hadoop + Spark的VirtualMachine设置,我正在从HDFS中读取文本文件“ words.txt”,然后调用map(),flatmap(),然后reduceByKey()和尝试获取前10个最常用的单词及其出现次数。我已经完成了大部分代码,然后汇总了元组列表,但是我只需要一种方法来查找前十名。我知道我只需要简单地遍历元组中的值(键是实际的str单词,但是该值是单词在words.txt文件中出现的次数的整数),并且只有一个计数器可以计算顶部10.(K,V)值对是Key = words.txt中的word,而Value =整数累加值,表示它在文件中出现的次数。下面的屏幕截图是在调用reduceByKey()之后,您可以看到“ the”出现了40次(并且屏幕快照的右侧)。

这是输出: enter image description here

到目前为止,这是我的代码:

from pyspark import SparkcConf, SparkContext

# Spark set-up
conf = SparkConf()
conf.setAppName("Word count App")
sc = SparkContext(conf=conf)

# read from text file words.txt on HDFS
rdd = sc.textFile("/user/spark/words.txt")

# flatMap() to output multiple elements for each input value, split on space and make each word lowercase
rdd = rdd.flatMap(lamda x: x.lower().split(' '))

# Map a tuple and append int 1 for each word in words.txt
rdd = rdd.map(lamda x: (x,1))

# Perform aggregation (sum) all the int values for each unique key)
rdd = rdd.reduceByKey(lamda x, y: x+y)

# This is where I need a function or lambda to sort by descending order so I can grab the top 10 outputs, then print them out below with for loop

# for item in out:
print(item[0], '\t:\t', str(item[1]))

我知道我通常只会创建一个名为“ max”的变量,并且仅当在列表或元组中找到了max时才对其进行更新,但是令我感到困惑的是我正在处理Spark和RDD,所以我一直在错误,因为我对RDD在执行map,flatmap,reduceByKey等操作时返回的内容感到有些困惑。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

您可以在缩小后反转K,V,以便可以使用sortByKey函数:

rdd.map(lambda (k,v): (v,k)).sortByKey(False).take(10)

对于Python 3 :(由于不再支持在lambda表达式中进行元组拆包)

rdd.map(lambda x: (x[1], x[0]).sortByKey(False).take(10)