spark中使用flatmap报错:TypeError: ‘int‘ object is not subscriptable

1、背景描述

菜鸟笔者在运行下面代码时发生了报错:

python 复制代码
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())

报错描述如下:

2、报错原因

显然这是传入的数据类型发生了错误:

因为我们试图对整数对象执行下标操作,而这是不允许的。

原来flatMap底层通过取下标来展开元素 如果rdd集合里面有非可迭代对象(如int元素)则会报错TypeError: 'int' object is not subscriptable。

查看flatmap算子源码我们知道,传入的参数被要求是一个可迭代对象,那么rdd集合中有int元素报错也就不奇怪了。

3、解决方案

解决方法如下:

我们可以在映射函数内部处理这种情况。例如,如果要返回单个元素,可以将其放入一个列表中,以确保总是返回一个可迭代对象。

python 复制代码
from pyspark import SparkContext

sc = SparkContext("local", "apple1012")

rdd = sc.parallelize([[1, 2], 3, [7, 5, 6]])

# flatMap底层通过取下标来展开元素 如果rdd集合里面有非可迭代对象(如int元素)则会报错TypeError: 'int' object is not subscriptable


def my_flatmap(x):
    if isinstance(x, int):
        # 如果是整数,将其放入一个列表中
        return [x]
    else:
        # 如果不是整数,直接返回可迭代对象
        return x


rdd1 = rdd.flatMap(my_flatmap)
print(rdd1.collect())

修改代码后我们运行程序,完美执行:

相关推荐
Nayana12 小时前
《Web 到 HarmonyOS》-- 业务分析:消息推送业务方法
前端
GreenTea12 小时前
发布 3 天登顶 HN:不生成一个字的模型 Jev,我把它的源码和黑料都扒了一遍
前端·后端·算法
前端小崔13 小时前
Three.js 与 Cesium 融合实战问题汇总
前端·three.js·cesium
wizardpisces13 小时前
Claude Code 是 Angular,Codex 是 Vue,DeepSeek 想当 React
前端·人工智能
一条溺水的鱼13 小时前
一次讲透 JS 原型链 —— prototype、__proto__ 和 constructor 到底啥关系
javascript
三乐22813 小时前
一文搞懂 JS 事件流:捕获、冒泡、事件委托
javascript·html
计算机魔术师13 小时前
纽约时报诉 OpenAI 案新解封文件:微软与 OpenAI 内部承认 LLM 建立在窃取之上并引发 Doom Loop
前端
PedroQue9914 小时前
uni-app x 事件通信插件重磅上线
前端·uni-app
lichenyang45314 小时前
ASCF WebView:H5 为什么收不到元服务消息?
前端
莪_幻尘14 小时前
从 0 到 1 搭建你的 AI Agent 平台:当 Agent 有了工厂,人人都能造同事
前端·ai编程