Для этой проблемы вам нужно использовать rdd concepts like map, flatMap, distinct
и python lambda, eval
Вот шаги: -
Давайте начнем с создания rdd: -
my_rdd = sc.parallelize(["2\t{'3': 1}",
"3\t{'2': 1}",
"4\t{'1': 1, '2': 1}",
"5\t{'4': 1, '2': 1, '6': 1}",
"6\t{'2': 1, '5': 1}",
"7\t{'2': 1, '5': 1}",
"8\t{'2': 1, '5': 1}",
"9\t{'2': 1, '5': 1}",
"10\t{'5': 1}",
"11\t{'5': 1}"
])
my_rdd.collect()
["2\t{'3': 1}",
"3\t{'2': 1}",
"4\t{'1': 1, '2': 1}",
"5\t{'4': 1, '2': 1, '6': 1}",
"6\t{'2': 1, '5': 1}",
"7\t{'2': 1, '5': 1}",
"8\t{'2': 1, '5': 1}",
"9\t{'2': 1, '5': 1}",
"10\t{'5': 1}",
"11\t{'5': 1}"]
Затем разделите с помощью \t
и eval
dict: -
new_my_rdd = my_rdd.map(lambda x:eval(x.split("\t")[1]))
new_my_rdd.collect()
[{'3': 1},
{'2': 1},
{'1': 1, '2': 1},
{'2': 1, '4': 1, '6': 1},
{'2': 1, '5': 1},
{'2': 1, '5': 1},
{'2': 1, '5': 1},
{'2': 1, '5': 1},
{'5': 1},
{'5': 1}]
Теперь извлекайте только ключи и используйте flatMap
для преобразования их в строки: -
new_my_rdd2 = new_my_rdd.flatMap(lambda x:x.keys())
new_my_rdd2.collect()
['3',
'2',
'1',
'2',
'2',
'4',
'6',
'2',
'5',
'2',
'5',
'2',
'5',
'2',
'5',
'5',
'5']
Наконец, подсчитайте различные значения: -
new_my_rdd2.distinct().count()
6