Функция foldByKey: использование целого числа внутри кортежа для вычисления, дающего "int object not subscriptable" - PullRequest
0 голосов
/ 27 февраля 2020

Я новичок в кирпичах данных и pyspark. Экспериментируя с несколькими вещами, которые я изучил до сих пор, я столкнулся со следующей проблемой. Любая помощь была бы отличной.

У меня есть RDD, как (имя ученика, предмет, оценки). Я пытаюсь добавить оценки по всем предметам конкретного ученика и произвести вывод, например (имя ученика, общее количество баллов), используя foldByKey.

Мой код:

newRdd = sc.parallelize([
  ("Joseph","maths",4),("Joseph","science",1)])

def addFunc(accumulator, element):
  return accumulator + element[1]

newRdd.map(lambda t: (t[0],(t[1],t[2]))).foldByKey(0, addFunc).collect()

Получение ошибка ** "

int объект не является подписным

для оператора return в функции addFunc. Я думаю, что это вызвано element[1] изнутри addFunc

Я думал, что foldByKey отправит кортежи ("maths",4) и ("science",1) в addFunc параметр element, поэтому мне нужно использовать element[1] для извлечения меток из кортежа и добавьте его к accumulator

Если я использую только return accumulator + element без индекса, то получаю ошибку

TypeError : unsupported operand type(s) for +: 'int' and 'tuple'

, возможно, потому что element получает кортежи ("maths",4) и ("science",1)

Если я использую return accumulator + element[0], тогда я получаю ошибку

TypeError : unsupported operand type(s) for +: 'int' and 'str'

, что, я думаю, так как в этом случае element[0] извлекает имена субъектов как strings.

Объяснение того, как foldByKey выполняет итерацию по rdd, и как параметры передаются в addFun c: очень полезно понять, почему я получаю ошибку

1 Ответ

0 голосов
/ 29 марта 2020

Вы можете попробовать это.

rdd1 = newRdd.map(lambda x : (x[0],x[2]))
rdd2 = rdd1.foldByKey(0,lambda x,y: x+y)
rdd2.collect()

[('Джозеф', 5)]

...