Skip to main content
 首页 » 编程设计

python之pyspark/python 3.6(类型错误 : 'int' object is not subscriptable) list/tuples

2024年12月31日26java哥

我在 pyspark/python 中有这段代码:

n --> 是新列表的个数

n = 2 
 
new tuple ( x, y, z ) 

地点:

x --> index 
 
y --> list [where variable n is a number of itens of list] 
 
z --> value of front value of list 

我正在执行这段代码:

RDD_Dados = RDD_one.map(lambda x: (x[0],  
                                  [list(x[i][1]) for i in range(n)], 
                                  x[i+1][1]) 
                        ) 

RDD_one的内容是:

(0, [(0, '5'), (1, '1'), (2, '2'), (3, '4'), (4, '4'), (5, '3.5'), (6, '-2'), (7, '1'), (8, '2'), (9, '0')]) 
(1, [(1, '1'), (2, '2'), (3, '4'), (4, '4'), (5, '3.5'), (6, '-2'), (7, '1'), (8, '2'), (9, '0')]) 
(2, [(2, '2'), (3, '4'), (4, '4'), (5, '3.5'), (6, '-2'), (7, '1'), (8, '2'), (9, '0')]) 
(3, [(3, '4'), (4, '4'), (5, '3.5'), (6, '-2'), (7, '1'), (8, '2'), (9, '0')]) 
(4, [(4, '4'), (5, '3.5'), (6, '-2'), (7, '1'), (8, '2'), (9, '0')]) 
(5, [(5, '3.5'), (6, '-2'), (7, '1'), (8, '2'), (9, '0')]) 
(6, [(6, '-2'), (7, '1'), (8, '2'), (9, '0')]) 
(7, [(7, '1'), (8, '2'), (9, '0')]) 
(8, [(8, '2'), (9, '0')]) 
(9, [(9, '0')]) 

我想获取每个二元组的每个第二项并制作一个新列表,如下所示:

(0, ['5','1'], '2') 
(1, ['1','2'], '4') 
(2, ['2','4'], '4') 
(3, ['4','4'], '3.5') 
(4, ['4','3.5'], '-2') 
(5, ['3.5','-2'], '1') 
(6, ['-2','1'], '2') 
(7, ['1','2'], '0') 

但不起作用。

我一直收到这个错误:

--------------------------------------------------------------------------- 
Py4JJavaError                             Traceback (most recent call last) 
<ipython-input-12-3532f6a9c36a> in <module>( 
59 RDD_Dados = RDD_one.map(lambda x: (x[0],[list(x[i][1]) for i in range(n)],x[i+1][1])) 
 
  File "C:\Spark\spark-2.3.0-bin-hadoop2.7\python\lib\pyspark.zip\pyspark\worker.py", line 229, in main 
File "C:\Spark\spark-2.3.0-bin-hadoop2.7\python\lib\pyspark.zip\pyspark\worker.py", line 224, in process 
File "C:\Spark\spark-2.3.0-bin-hadoop2.7\python\lib\pyspark.zip\pyspark\serializers.py", line 372, in dump_stream 
vs = list(itertools.islice(iterator, batch)) 
File "<ipython-input-12-3532f6a9c36a>", line 59, in <lambda> 
File "<ipython-input-12-3532f6a9c36a>", line 59, in <listcomp> 
TypeError: 'int' object is not subscriptable 

请您参考如下方法:

改变

RDD_Dados = RDD_one.map(lambda x: (x[0],  
                                  [list(x[i][1]) for i in range(n)], 
                                  x[i+1][1])) 

对于

RDD_Dados = RDD_one.map(lambda x: (x[0],  
                                  [x[i][1] for i in range(1,n+1)], 
                                  x[n][1])) 

range 从 0 开始,因此您在第一次迭代中执行 x[0][1]。但是,x[0] 是一个整数,因此是您的问题。另外,你不需要用 list 包裹 x[i][1] 否则你会得到例如(0, [ ['5'], ['1'] ], '2') 而不是 (0, ['5','1'], '2')


编辑:

对于更通用和更灵活的方法,您可以创建一个自定义函数,您可以在其中进一步扩展逻辑。
例如:

def my_logic(x): 
   ret = [x[0], []] 
   for i in range(1, n): 
       try: 
           ret[1].append(x[1][i][1]) 
       except IndexError: 
           ret[1].append(0) 
           break 
   if len(x[1]) > n: 
       ret.append(x[1][n][1]) 
   else: 
       ret.append(0) 
   return ret 

然后就是做

RDD_Dados = RDD_one.map(my_logic)