количество словарных ключей внутри (ключ, {ключ, значение}) записей - PullRequest
0 голосов
/ 12 марта 2019

Это часть домашнего задания и простой концептуальный вопрос. У меня есть записи значений ключей в PySpark, где значения являются словарями разных размеров.

testRDD.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}"]

Я начал с

totalCount = dataRDD.map(lambda x: x.split("\t")) \

и еще 3 строки кода для подсчета количества различных ключей в словарях. Подсказка для формата ключа (значение ключа) (то есть следующая строка моего кода pyspark) должна быть всем, что мне нужно для начала работы. Я пытался взять .keys () внутри flatMap и flatMapValues ​​() [с лямбда-функцией] безуспешно. В случае .keys () мне говорят, что у меня есть список, а не словарь. Я понимаю, почему это так, но я не знаю, как с этим справиться.

Ожидаемый результат в конце моего запроса на pyspark будет простым числом 6 для этого testRDD.

Я вижу из подобных вопросов, что понимание списка может быть решением, но я все еще не очень хорошо знаю, как использовать это внутри карты ()? лямбда-функция в писпарке.

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Для этой проблемы вам нужно использовать 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
1 голос
/ 12 марта 2019

Еще один способ решения этой проблемы с помощью подхода RDD.

>>> rdd=["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}"]
>>> rdd
["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}"]
>>> rdd_1=sc.parallelize(rdd)
>>> rdd_1.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}"]
>>> rdd_2=rdd_1.flatMap(lambda x:x.split("\t")[1].split(",")).map(lambda x:x.replace("'","").replace("'",""))
>>> len(set(rdd_2.map(lambda x:x.replace('{','').replace('}','').replace(' ','').split(":")[0]).collect()))
6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...