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

Posted

技术标签:

【中文标题】TypeError:元组索引必须是整数,而不是使用 pyspark 和 RDD 的 str【英文标题】:TypeError: tuple indices must be integers, not str using pyspark and RDD 【发布时间】:2018-05-18 15:07:15 【问题描述】:

我是 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】:

mapValues 只能应用于 (key, value) 对的 RDD(RDD 其中每个元素是等于 2 的 lengthtuple,或行为为 1 的某个对象 - 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)))

【讨论】:

请问您为什么建议使用 flatMapValues 然后使用 mapValue?我添加了其余的方法以获得更清晰的视觉(它计算 tfidf)。提前谢谢你 感谢您的帮助。我按照您的建议做了,但它导致了类型错误。我编辑问题以显示触发的错误。

以上是关于TypeError:元组索引必须是整数,而不是使用 pyspark 和 RDD 的 str的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:列表索引必须是整数或切片,而不是尝试制作二维列表时的元组

TypeError:列表索引必须是整数,而不是浮点数

TypeError:列表索引必须是整数或切片,而不是列表

TypeError:列表索引必须是整数或切片,而不是浮点数

TypeError:列表索引必须是整数或切片,而不是 str

Python'列表索引必须是整数,而不是元组”错误