Pyspark — RDD извлекает значения для агрегирования

#apache-spark #pyspark #rdd

#apache-spark #pyspark #rdd

Вопрос:

Используя Pyspark, я пытаюсь работать с RDD для агрегирования на основе содержимого этого RDD.

Мой RDD в настоящее время выглядит так (очевидно, с гораздо большим количеством данных):

 [([u'User1', u'2'], 1), ([u'User2', u'2'], 1), ([u'User1', u'3'], 1)]
 

Я хочу объединить это в формат:

 User1  5
User2  2
 

Я изо всех сил пытаюсь взаимодействовать с RDD, в частности со списками внутри RDD, чтобы получить доступ к этим данным. Я также должен сохранить это в RDD, а не преобразовывать его в фрейм данных.

Кто-нибудь может показать мне, как это сделать, пожалуйста?

Ответ №1:

Другое решение, очень похожее на @mck, но немного более понятное, — использовать оператор add вместо другой лямбда-функции:

 from operator import add 

rdd = sc.parallelize([("user1", "2"), ("user2", "2"), ("user1", "3")])
rdd = rdd.map(lambda x: (x[0], int(x[1])))
rdd = rdd.reduceByKey(add)

"""
>>> rdd.collect()
>>> Out[54]: [('user2', 2), ('user1', 5)]
"""
 

Ответ №2:

Вы можете map преобразовать RDD в формат (user, value) и выполнить reduceByKey группировку по пользователю и суммировать значения.

 result = rdd.map(lambda x: (x[0][0], int(x[0][1]))).reduceByKey(lambda x, y: x   y)

result.collect()
# [('User2', 2), ('User1', 5)]