В строке 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
.