PySpark: как разделить строковое значение в парном RDD и сопоставить с ключом - PullRequest
3 голосов
/ 25 апреля 2020

Учитывая

data = sc.parallelize([(1,'winter is coming'),(2,'ours is the fury'),(3,'the old the true the brave')])

Мой желаемый вывод -

[('fury',[2],('true',[3]),('is',[1,2]),('old',[3]),('the',[2,3]),('ours',[2]),('brave',[3]),('winter',[1]),('coming',[1])]

Я не уверен, как отобразить следующий вывод

[(1,'winter'),(1,'is'),(1,'coming'),(2,'ours'),(2,'is'),....etc.]`

Я пытался использовать

data.flatMap(lambda x: [(x[0], v) for v in x[1]]

, но это закончилось тем, что ключ соответствовал каждой букве строки вместо слова. Если здесь используется функция flatMap, map или split ?

После сопоставления я планирую сократить парные RDD с аналогичными ключами и обратным ключом и значением, используя

data.reduceByKey(lambda a,b: a+b).map(lambda x:(x[1],x[0])).collect()

Правильно ли мое мышление?

1 Ответ

2 голосов
/ 25 апреля 2020

Вы можете flatMap и создавать кортежи, в которых ключи используются повторно, и для каждого слова создается запись (полученная с помощью split()):

data.flatMap(lambda pair: [(pair[0], word) for word in pair[1].split()])

При сборе выводится

[(1, 'winter'),
 (1, 'is'),
 (1, 'coming'),
 (2, 'ours'),
 (2, 'is'),
 (2, 'the'),
 (2, 'fury'),
 (3, 'the'),
 (3, 'old'),
 (3, 'the'),
 (3, 'true'),
 (3, 'the'),
 (3, 'brave')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...