Python Pypark反向指数

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中

我正在创建一个文档的反向索引,其中输出应该包含一个单词(来自文本文件),后跟它出现的所有文件。差不多

[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)