?1、背景描述
菜鳥筆者在運(yùn)行下面代碼時(shí)發(fā)生了報(bào)錯(cuò):
from pyspark import SparkContext
sc = SparkContext("local", "apple1012")
rdd = sc.parallelize([[1, 2], 3, [7, 5, 6]])
rdd1 = rdd.flatMap(lambda x: x)
print(rdd1.collect())
報(bào)錯(cuò)描述如下:
2、報(bào)錯(cuò)原因
?顯然這是傳入的數(shù)據(jù)類型發(fā)生了錯(cuò)誤:
因?yàn)槲覀冊(cè)噲D對(duì)整數(shù)對(duì)象執(zhí)行下標(biāo)操作,而這是不允許的。
原來flatMap底層通過取下標(biāo)來展開元素 如果rdd集合里面有非可迭代對(duì)象(如int元素)則會(huì)報(bào)錯(cuò)TypeError: 'int' object is not subscriptable。
查看flatmap算子源碼我們知道,傳入的參數(shù)被要求是一個(gè)可迭代對(duì)象,那么rdd集合中有int元素報(bào)錯(cuò)也就不奇怪了。
3、解決方案?
解決方法如下:
我們可以在映射函數(shù)內(nèi)部處理這種情況。例如,如果要返回單個(gè)元素,可以將其放入一個(gè)列表中,以確保總是返回一個(gè)可迭代對(duì)象。
from pyspark import SparkContext
sc = SparkContext("local", "apple1012")
rdd = sc.parallelize([[1, 2], 3, [7, 5, 6]])
# flatMap底層通過取下標(biāo)來展開元素 如果rdd集合里面有非可迭代對(duì)象(如int元素)則會(huì)報(bào)錯(cuò)TypeError: 'int' object is not subscriptable
def my_flatmap(x):
if isinstance(x, int):
# 如果是整數(shù),將其放入一個(gè)列表中
return [x]
else:
# 如果不是整數(shù),直接返回可迭代對(duì)象
return x
rdd1 = rdd.flatMap(my_flatmap)
print(rdd1.collect())
?修改代碼后我們運(yùn)行程序,完美執(zhí)行:文章來源:http://www.zghlxwxcb.cn/news/detail-767327.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-767327.html
到了這里,關(guān)于spark中使用flatmap報(bào)錯(cuò):TypeError: ‘int‘ object is not subscriptable的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!