Я новичок в кирпичах данных и 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: очень полезно понять, почему я получаю ошибку