TypeError:元组索引必须是整数,而不是使用pyspark和RDD的str

时间:2018-05-18 15:07:15

标签: python python-2.7 apache-spark pyspark rdd

我是Python的新手。我也是pysaprk的新手。我尝试运行一个代码行(kv [0],kv [1]),然后在kv [1]上运行ngrams()函数。

此处还有代码处理的mentions数据的示例布局:

Out[12]: 
[{'_id': u'en.wikipedia.org/wiki/Kamchatka_Peninsula',
  'source': 'en.wikipedia.org/wiki/Warthead_sculpin',
  'span': (100, 119),
  'text': u' It is native to the northern.'},
 {'_id': u'en.wikipedia.org/wiki/Warthead_sculpin',
  'source': 'en.wikipedia.org/wiki/Warthead_sculpin',
  'span': (4, 20),
  'text': u'The warthead sculpin ("Myoxocephalus niger").'}]

这是我正在使用的代码:

    def build(self, mentions, idfs):
            m = mentions\
                .map(lambda (source, target, span, text): (target, text))
                .flatMapValues(lambda v: ngrams(v, self.max_ngram))
                .map(lambda v: (v, 1))
                .reduceByKey(add)\

如何制定上一步的数据来解决此错误? 任何帮助或指导都将得到真正的赞赏。

我使用的是python 2.7和pyspark 2.3.0。

谢谢,

1 个答案:

答案 0 :(得分:1)

mapValues只适用于(key, value)对(RDD的RDD,其中每个元素都是tuple length等于2,或者某些行为为一的对象 - How to determine if object is a valid key-value pair in PySpark

您的数据是字典,因此不符合条件。目前尚不清楚您的期望,但您怀疑自己想要:

from operator import itemgetter

(mentions
  .map(itemgetter("_id", "text"))
  .flatMapValues(lambda v: ngrams(v, self.max_ngram))
  .map(lambda v: (v, 1)))