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

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

相关推荐
冰暮流星1 分钟前
css3如何引入外部字体
前端·css·css3
ByteCraze9 分钟前
从零到一:构建一个实时语音翻译应用(Vue3 + Web Speech API)
前端·开源·github
名字被你们想完了20 分钟前
Flutter 实现一个容器内部元素可平移、缩放和旋转等功能(三)
前端·flutter
用户120391129472622 分钟前
从零掌握 React JSX:为什么它让前端开发像搭积木一样简单?
前端·react.js·面试
Jonathan Star23 分钟前
git commit --amend 是 Git 中用于修改最后一次提交的核心命令
前端·chrome·git
在掘金8011026 分钟前
RequireJS 详解
前端·javascript
cindershade28 分钟前
我对防抖(Debounce)的一点理解与实践:从基础到立即执行
javascript
morning_judger43 分钟前
JavaScript封装演进史:从全局变量到闭包
开发语言·javascript
spencer_tseng1 小时前
jquery.min.js v1.12.4
javascript·jquery
派大鑫wink1 小时前
Python 流程控制实战:打造文字版数独小游戏(新手友好)
服务器·前端·microsoft