Как использовать aggregateBykey, чтобы получить список значений для каждого ключа? - PullRequest
0 голосов
/ 06 апреля 2019

Допустим, у нас есть элемент, содержащий rdd, каждый из которых выглядит следующим образом:

(studentName, course, grade):

("Joseph", "Maths", 83), ("Joseph", "Physics", 74), ("Joseph", "Chemistry", 91), ("Joseph", "Biology", 82), 
  ("Jimmy", "Maths", 69), ("Jimmy", "Physics", 62), ("Jimmy", "Chemistry", 97), ("Jimmy", "Biology", 80), 
  ("Tina", "Maths", 78), ("Tina", "Physics", 73), ("Tina", "Chemistry", 68)

Моя цель состоит в том, чтобы получить еще один rdd, состоящий из (StudentName, [(course, grade)]), используя aggregateBykey:

("Joseph", [("Maths", 83),("Physics", 74), ("Chemistry", 91), ("Biology", 82)]) 
  ("Jimmy", [("Maths", 69), ("Physics", 62), ("Chemistry", 97), ("Biology", 80)])
  ("Tina", [("Maths", 78), ("Physics", 73), ("Chemistry", 68)])

Я попробовал следующее:

zero_val = []

student_list_rdd = studentRDD(lambda u: (u[0], (u[1], u[2]))).aggregateByKey(zero_val, seq_op, comb_op) 

def seq_op(accumulator, element):
    if element not in accumulator:
        return element
    return accumulator

# Combiner Operation : Finding Maximum Marks out Partition-Wise Accumulators
def comb_op(accumulator1, accumulator2):
    return accumulator1 + accumulator2

Но я получил следующий результат:

("Joseph", ("Maths", 83,"Physics", 74, "Chemistry", 91, "Biology", 82) 
      ("Jimmy", ("Maths", 69, "Physics", 62, "Chemistry", 97, "Biology", 80)
      ("Tina", ("Maths", 78, "Physics", 73, "Chemistry", 68)

Какой-нибудь намек на получение желаемого выхода будет так ценится?

Как мы можем сделать то же самое, если у нас есть фрейм данных pyspark с тремя столбцами: <student, course, grade>

1 Ответ

1 голос
/ 06 апреля 2019

Нет необходимости в aggregateByKey, groupBy должно работать.Просто groupBy первое значение, а затем преобразуйте каждую группу, удалив первое значение из каждого кортежа:

rdd.groupBy(lambda x: x[0]).mapValues(lambda g: [x[1:] for x in g]).collect()

# [('Jimmy', [('Maths', 69), ('Physics', 62), ('Chemistry', 97), ('Biology', 80)]), 
#  ('Tina', [('Maths', 78), ('Physics', 73), ('Chemistry', 68)]), 
#  ('Joseph', [('Maths', 83), ('Physics', 74), ('Chemistry', 91), ('Biology', 82)])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...