我正在创建一个倒置的文档索引,其中输出应该包含一个单词(来自文本文件),后面跟着它出现的所有文件。像
这样的东西[word1:file1.txt file2.txt] [word2:file2.txt file3.txt]
我已经编写了代码但它却抛出了这个错误。
表示k,v表示迭代器: TypeError :()只需要2个参数(给定1个)
代码:
from pyspark import SparkContext
sc = SparkContext("local", "app")
path = '/ebooks'
rdd = sc.wholeTextFiles(path)
output = rdd.flatMap(lambda (file,contents):contents.lower().split())\
.map(lambda file,word: (word,file))\
.reduceByKey(lambda a,b: a+b)
print output.take(10)
我无法想出一种在地图中发出键和值(单词和文件名)的方法。我该怎么办呢?
在mapreduce中,可以发出(word,key)对(key是文件名)但是如何在spark中完成?
答案 0 :(得分:2)
我还没有对虚拟数据进行测试,但是看看你的代码,我认为以下修改应该有效:
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)
答案 1 :(得分:0)
无法找出发出键和值的方法
使用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')]