【问题标题】:pyspark / python 3.6 (TypeError: 'int' object is not subscriptable) list / tuplespyspark / python 3.6(TypeError:'int'对象不可下标)列表/元组
【发布时间】:2018-05-05 20:09:17
【问题描述】:

我在 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

【问题讨论】:

  • 你有什么理由想要同时拥有整数和整数的字符? (例如,(0, '5'))。只是好奇。

标签: python lambda pyspark rdd


【解决方案1】:

改变

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

range0 开始,所以您在第一次迭代中执行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)

【讨论】:

  • 我做到了。我发现了这个错误:TypeError: can only concatenate list (not "int") to list
  • 如果您将n 变量为整数?注意,我编辑了代码,最后一段应该是n
  • 是的。我试过这样做: RDD_Dados = RDD_one.map(lambda x: (x[0], [x[i][1] for i in range(1,int(n)+1)], x[int(n) +1][1])) 并告诉我这个错误:TypeError: can only concatenate list (not "int") to list
  • 试试RDD_one.map(lambda x: (x[0], [x[1][i][1] for i in range(1,int(n)+1)], x[int(n)+1][1]))
  • Ir 超出范围,因为您在 RDD 中的最后一个元素只有一个元素,并且您尝试迭代两次(即n=2
【解决方案2】:

我解决了这个问题:

首先,我使用过滤器制作一个RDD,根据参数N的数量去除不必要的数据。

RDDFilter = DadosAgrupadosPorChaveOrdenados.filter(lambda x: n < len(x[1]))

之后,我根据需要执行另一个 RDD 挂载数据:

DadosFinal = RDDFilter.map(lambda x: (x[0], 
                              [x[1][i][1] for i in range(0,int(n))], 
                              x[1][int(n)][1]))

非常感谢您的帮助。

【讨论】:

    猜你喜欢
    • 2018-08-02
    • 2023-03-20
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2017-07-15
    • 2012-02-21
    • 2018-08-07
    相关资源
    最近更新 更多