Как использовать преобразования в попарных СДР в PySpark? - PullRequest
0 голосов
/ 01 мая 2019

Я хочу преобразовать эту СДР:

[(['1', '2', '3'], 'abc'), (['4', '5', '6'], 'xyz')]

к этой форме:

[('1', 'abc'), ('2', 'abc'), ('3', 'abc'), ('4', 'xyz'), ('5', 'xyz'), ('6', 'xyz')]

Как мне добиться этого с помощью преобразований RDD в PySpark?

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Поскольку у меня нет 50rep, чтобы комментировать решение Ракеша, я опубликую свой собственный ответ, который очень похож на ответ Ракеша, за исключением того, что нам не нужно звонить map до flatMap, просто используйте flatMap напрямую. Как следует из названия, flatMap сгладит результат, вызывая map до этого не нужно.

rdd = sc.parallelize([(['1', '2', '3'], 'abc'), (['4', '5', '6'], 'xyz')])
r = rdd.flatMap(lambda item: [(k, item[1]) for k in item[0]])
r.collect() # to show result
1 голос
/ 01 мая 2019

Вам нужно использовать функцию flatMap, для этого также нужно кое-что понять. Вот шаги, чтобы сделать это -

Создать rdd с предоставленными данными -

rdd = sc.parallelize([(['1', '2', '3'], 'abc'), (['4', '5', '6'], 'xyz')])
rdd.collect()
[(['1', '2', '3'], 'abc'),
(['4', '5', '6'], 'xyz')] 

Сопоставить значения каждого субключа с формой key,value pair -

rdd.map(lambda x:[(i,x[1]) for i in x[0]],).collect()
[[('1', 'abc'), ('2', 'abc'), ('3', 'abc')],
 [('4', 'xyz'), ('5', 'xyz'), ('6', 'xyz')]]

Наконец, примените flatMap, чтобы разбить его на количество строк -

rdd.map(lambda x:[(i,x[1]) for i in x[0]],).flatMap(lambda x:x).collect()
[('1', 'abc'),
 ('2', 'abc'),
 ('3', 'abc'),
 ('4', 'xyz'),
 ('5', 'xyz'),
 ('6', 'xyz')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...