Python Pypark反向指数
我正在创建一个文档的反向索引,其中输出应该包含一个单词(来自文本文件),后跟它出现的所有文件。差不多 [word1:file1.txt file2.txt][word2:file2.txt file3.txt] 我已经写了代码,但它抛出了这个错误 对于迭代器中的k,v: TypeError:()正好接受2个参数(给定1个) 代码: 我想不出在映射中同时发出键和值(word和文件名)的方法。我该怎么做呢 在mapreduce中,可以发出(word,key)对(key是文件名),但如何在spark中做到这一点 无法找到同时发出键和值的方法 使用Python Pypark反向指数,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我正在创建一个文档的反向索引,其中输出应该包含一个单词(来自文本文件),后跟它出现的所有文件。差不多 [word1:file1.txt file2.txt][word2:file2.txt file3.txt] 我已经写了代码,但它抛出了这个错误 对于迭代器中的k,v: TypeError:()正好接受2个参数(给定1个) 代码: 我想不出在映射中同时发出键和值(word和文件名)的方法。我该怎么做呢 在mapreduce中,可以发出(word,key)对(key是文件名),但如何在spark中
flatMapValues
:
rdd = sc.wholeTextFiles("README.md")
rdd.flatMapValues(lambda content: content.lower().split()).take(3)
# [('file:/spark/README.md', '#'),
# ('file:/spark/README.md', 'apache'),
# ('file:/spark/README.md', 'spark')]
使用flatMap
可以:
rdd.flatMap(
lambda fc: ((fc[0], s) for s in fc[1].lower().split()))
# [('file:/spark/README.md', '#'),
# ('file:/spark/README.md', 'apache'),
# ('file:/spark/README.md', 'spark')]
我还没有在虚拟数据上测试过这一点,但看看您的代码,我认为以下修改应该可以工作:
output = rdd.flatMap(lambda (file,contents):[(file, word) for word in contents.lower().split()])\
.map(lambda (file, word): (word,[file]))\
.reduceByKey(lambda a,b: a+b)
使用flatMapValues时,我会得到错误“太多的值无法解包”,而使用flatMap时,我会得到错误“内容未定义”。谢谢,您的答案有效。你能告诉我如何过滤所有书籍中出现的单词吗?我尝试了
.filter(lambda-word:word-if-count(file)>num\u-files
,但显然count方法不存在。
output = rdd.flatMap(lambda (file,contents):[(file, word) for word in contents.lower().split()])\
.map(lambda (file, word): (word,[file]))\
.reduceByKey(lambda a,b: a+b)