Каким образом одновременно работают reduByKey и mapValues? - PullRequest
0 голосов
/ 21 ноября 2018

Я совершенно новичок в мире больших данных.У меня есть код, который на самом деле создает функцию, которая разбивает файл CSV и возвращает два поля.

Затем есть функция карты, которая, как я знаю, работает, но я запутался в следующей части кода (операция происходит с переменной totalsByAge ), применяются mapValues ​​и reduByKey.Помогите, пожалуйста, понять, как здесь работают lessByKey и mapValues?

def parseLine(line):
fields = line.split(',')
age = int(fields[2])
numFriends = int(fields[3])
return (age,numFriends)

line = sparkCont.textFile("D:\\ResearchInMotion\\ml-100k\\fakefriends.csv")
rdd = line.map(parseLine)
totalsByAge = rdd.mapValues(lambda x: (x, 1)).reduceByKey(lambda x, y: (x[0] + y[0], x[1] + y[1]))
averagesByAge = totalsByAge.mapValues(lambda x: x[0] / x[1])
results = averagesByAge.collect()
for result in results:
    print(result)

Мне нужна помощь в totalsByAge обработке переменных. Было бы хорошо, если бы вы могли также подробно описать операцию, выполняемую для averagesByAge Пожалуйста, дайте мне знать, если чего-то не хватает.

1 Ответ

0 голосов
/ 21 ноября 2018

В строке rdd = line.map(parseLine) у вас есть пара значений в формате (age, numFriends), как (a_1, n_1), (a_2, n_2), ..., (a_m, n_m)rdd.mapValues(lambda x: (x, 1)) вы получите (a_1, (n_1, 1)), (a_2, (n_2, 1)), ..., (a_m, (n_m, 1)).

В reduceByKey, сначала сгруппированном по ключу, это означает все те же age, сгруппированные в группу, и у вас будет что-то вроде (a_i, iterator over pairs of (n_j, 1) which all n_j has the same age), и после этого примените функцию сокращения.А сокращенная часть означает суммирование всех numFriends друг с другом для каждого возраста и 1 s друг с другом, причем сумма 1 s означает количество элементов в списке.

Следовательно, после reduceByKey у нас будет (a_i, (sum of all numFriends in the list, number of items in the list)).Другими словами, первое значение внешней пары - age, а второе значение - внутренняя пара, первое значение которой является суммой всех numFriends, а второе значение - количество элементов.Следовательно, totalsByAge.mapValues(lambda x: x[0] / x[1]) дает нам среднее значение numFriends для каждого age.

...