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())

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

相关推荐
星云API技术支持2 分钟前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
京东云开发者23 分钟前
81.8 秒的视频,我们改了 15 个版本:一次纯 Codex 驱动的 AI-native 视频实践
前端·aigc
Csvn1 小时前
TypeScript 大型项目架构:从单体 tsconfig 到分层可扩展的工程
前端
计算机魔术师3 小时前
Dario Amodei 发文呼吁为前沿 AI 降速并提出三点计划
前端
计算机魔术师3 小时前
OpenAI的AI代理偷偷给RubyGems下毒,我们却毫无察觉
前端
甲维斯3 小时前
0代码,0建模,3句话开发一个3D游戏!
前端·游戏·游戏开发
IT_陈寒3 小时前
Vue的响应式更新把我坑惨了,原来问题出在这
前端·人工智能·后端
tingke3 小时前
别再堆 AGENTS.md 了:前端团队的 Agent 上下文分层落地指南
前端
李明卫杭州4 小时前
React 复合事件系统对比解析
前端·javascript·react.js
葡萄城技术团队4 小时前
SpreadJS V19.2 新特性揭秘:FILTERXML 函数
前端