当前位置:   article > 正文

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

int' object is not subscriptable

 1、背景描述

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

  1. from pyspark import SparkContext
  2. sc = SparkContext("local", "apple1012")
  3. rdd = sc.parallelize([[1, 2], 3, [7, 5, 6]])
  4. rdd1 = rdd.flatMap(lambda x: x)
  5. print(rdd1.collect())

报错描述如下:

2、报错原因

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

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

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

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

3、解决方案 

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

  1. from pyspark import SparkContext
  2. sc = SparkContext("local", "apple1012")
  3. rdd = sc.parallelize([[1, 2], 3, [7, 5, 6]])
  4. # flatMap底层通过取下标来展开元素 如果rdd集合里面有非可迭代对象(如int元素)则会报错TypeError: 'int' object is not subscriptable
  5. def my_flatmap(x):
  6. if isinstance(x, int):
  7. # 如果是整数,将其放入一个列表中
  8. return [x]
  9. else:
  10. # 如果不是整数,直接返回可迭代对象
  11. return x
  12. rdd1 = rdd.flatMap(my_flatmap)
  13. print(rdd1.collect())

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/579621
推荐阅读
相关标签
  

闽ICP备14008679号