Lambda函数触发TypeError:'int'对象不可迭代的问题求助
解决PySpark中Lambda函数的TypeError问题
嘿,我来帮你搞定这个错误!你遇到的TypeError: 'int' object is not iterable问题根源很明确——你的Lambda函数试图解构一个不存在的嵌套元组结构。
问题分析
先看你提供的DocumentFrequencies.collect()结果,每个元素都是这样的二元组:
[(u'fawn', 3), (u'1,800', 31), ...]
也就是(term, df)的结构,没有所谓的rank字段。但你在Idfs.build里写的第一个map函数是:
.map(lambda (term, (df,rank)): (term, df))
这个Lambda试图把每个元素解构为(term, (df, rank))——也就是期望第二个元素是一个包含两个值的元组,但实际上第二个元素是一个整数类型的df值。当Python尝试把这个int拆成(df, rank)时,就会抛出“int不可迭代”的错误。
修复方案
既然DocumentFrequencies.build返回的RDD已经是(term, df)的结构,你完全不需要那一步多余的map操作,直接对df计算IDF即可。修改后的Idfs.build方法如下:
def build(self, corpus): log.info('Counting documents in corpus...') N = float(corpus.count()) dfs = super(Idfs, self).build(corpus) log.info('Building idf model: N=%i', N) return dfs\ .mapValues(lambda df: math.log(N/df))
额外说明
- 如果你之前误以为
DocumentFrequencies.build会返回带rank的嵌套元组,那可以检查一下DocumentFrequencies的逻辑:它通过reduceByKey(add)得到的就是每个term的文档频次df,没有任何rank相关的计算,所以根本不会有这个字段。 - 确保导入了
math模块(你代码里用了math.log,如果没导入的话要加上import math)。
这样修改后,你的IDF模型就能正常运行了,每个term对应的IDF值会被正确计算出来。
内容的提问来源于stack exchange,提问作者user3446905
相关产品推荐
相关产品推荐

