Pyspark倒排指数

时间:2017-12-05 15:47:04

标签: python apache-spark pyspark

我正在创建一个倒置的文档索引,其中输出应该包含一个单词(来自文本文件),后面跟着它出现的所有文件。像

这样的东西
  

[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中完成?

2 个答案:

答案 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')]