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

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

相关推荐
怒放的生命199133 分钟前
pnpm + Monorepo 使用教程(集成 Vue 3 项目)
前端·vue.js·pnpm·monorepo·前端工程化
kkkAloha35 分钟前
JS笔记汇总
开发语言·javascript·笔记
佛系打工仔6 小时前
绘制K线第二章:背景网格绘制
android·前端·架构
明天好,会的7 小时前
分形生成实验(五):人机协同破局--30万token揭示Actix-web状态管理的微妙边界
运维·服务器·前端
C_心欲无痕8 小时前
nginx - alias 和 root 的区别详解
运维·前端·nginx
我是苏苏10 小时前
Web开发:C#通过ProcessStartInfo动态调用执行Python脚本
java·服务器·前端
无羡仙10 小时前
Vue插槽
前端·vue.js
哈__10 小时前
React Native 鸿蒙跨平台开发:PixelRatio 像素适配
javascript·react native·react.js
用户63879947730511 小时前
每组件(Per-Component)与集中式(Centralized)i18n
前端·javascript