2015-06-23 3 views
5

Это домашнее задание вопрос:Извлечение словаря из РДА в Pyspark

У меня есть RDD, который представляет собой набор ОСА кортежей. У меня также есть функция, которая возвращает словарь из каждого входного кортежа. Так или иначе, противоположность функции уменьшения.

С картой я могу легко перейти от RDD кортежей к словарям RDD. Но, поскольку словарь представляет собой набор пар (ключ, значение), я хотел бы преобразовать словарные словаря RDD в RDD (ключ, значение) кортежей с каждым содержанием словаря.

Таким образом, если мой RDD содержит 10 кортежей, то я получаю RDD, содержащий 10 словарей с 5 элементами (например), и, наконец, я получаю RDD из 50 кортежей.

Я предполагаю, что это должно быть возможно, но, как? (Может быть, проблема в том, что я не знаю, как эта операция называется на английском языке)

ответ

6

Я предполагаю, что вы хотите, это просто flatMap:

dicts = sc.parallelize([{"foo": 1, "bar": 2}, {"foo": 3, "baz": -1, "bar": 5}]) 
dicts.flatMap(lambda x: x.items()) 

flatMap принимает функцию из элемента РДА в итерации, а затем объединяет результаты. Другое название того же типа операции вне контекста искра mapcat:

>>> from toolz.curried import map, mapcat, concat, pipe 
>>> from itertools import repeat 
>>> pipe(range(4), mapcat(lambda i: repeat(i, i + 1)), list) 
[0, 1, 1, 2, 2, 2, 3, 3, 3, 3] 

или идти шаг за шагом:

>>> pipe(range(4), map(lambda i: repeat(i, i + 1)), concat, list) 
[0, 1, 1, 2, 2, 2, 3, 3, 3, 3] 

То же самое с помощью itertools.chain

>>> from itertools import chain 
>>> pipe((repeat(i, i + 1) for i in range(4)), chain.from_iterable, list) 
>>> [0, 1, 1, 2, 2, 2, 3, 3, 3, 3] 
+0

Несомненно! Не могли бы вы объяснить, какая разница между flatMap и картой? Я не думал, что flatMap для этих ситуаций ... –

+1

'flatMap' использует функцию, которая возвращает коллекцию ко всем элементам этого RDD, а затем выравнивает результаты. Посмотрите на подпись Scala 'Rdd.flatMap', которая упрощена: '(f: (T) ⇒ TraversableOnce [U]): RDD [U]' – zero323

+0

Я добавил несколько примеров, отличных от Spark. Надеюсь, это будет полезно. – zero323

9

Мои 2 цента :

Существует функция PairRDD с именем "collectA sMap ", который возвращает словарь из RDD.

Позволь мне показать вам пример:

sample = someRDD.sample(0, 0.0001, 0) 
sample_dict = sample.collectAsMap() 
print sample.collect() 
print sample_dict 

[('hi', 4123.0)] 
{'hi': 4123.0} 

Документация here

Надеется, что это помогает! С уважением!

+0

Очень удобно. Благодарю. Обратите внимание, что это не работает на RDD, это только список. Это должно быть кортежи, как показано выше. – Paul

Смежные вопросы