Разделите предложение и сгруппируйте каждое значение по ключу - PullRequest
0 голосов
/ 04 мая 2019

У меня есть входные данные в следующем формате, который я пытаюсь разделить и создать пару ключ-значение:

Ввод:

"SQL",1,2,3,4,5
"ORACLE",2,5,6,7

Предполагаемые данные для записи в RDD:

SQL,1
SQL,2
SQL,3
SQL,4
SQL,5
ORACLE,2
ORACLE,5
ORACLE,6
ORACLE,7

Я пытаюсь создать пару ключ-значение, используя приведенный ниже код, который не работает

data_rdd = f.zipWithIndex() \
        .map(lambda row: (row[0].replace('"', '').split(',')[0], (dst for dst in row[1:len(row[0])]))) \
        .aggregateByKey([], lambda a, b: a + [b], lambda a, b: a + b)

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

Использование flatMap () :

data_rdd.flatMap(lambda row: [ 
    (k, v) for k, vs in [row.replace('"','').split(',', 1)] for v in vs.split(',')
]).collect() 

#[('SQL', '1'),
# ('SQL', '2'),
# ('SQL', '3'),
# ('SQL', '4'),
# ('SQL', '5'),
# ('ORACLE', '2'),
# ('ORACLE', '5'),
# ('ORACLE', '6'),
# ('ORACLE', '7')]

Где:

  1. [row.replace('"','').split(',', 1)] преобразовать строку как "SQL",1,2,3,4,5в список из двух элементов SQL и 1,2,3,4,5
  2. vs.split(','), а затем разбить 2-й элемент на новый список
  3. тогда будет получено понимание списка с кортежами (k, v)быть сплющенным flatMap()
0 голосов
/ 04 мая 2019

Входные данные:

inp = '''"SQL",1,2,3,4,5
"ORACLE",2,5,6,7'''

Код:

res = []

for line in inp.splitlines():
    values = line.split(',')
    key = values[0].replace('"', '')
    res.extend((key, v) for v in values[1:])

print(res)

Примечание. Создается копия values без первого элемента, который пропускает ее.

ТакжеВы можете пропустить первый элемент, обратившись к values элементам по индексу:

res = []

for line in inp.splitlines():
    values = line.split(',')
    key = values[0].replace('"', '')
    res.extend((key, values[i]) for i in range(1, len(values)))

print(res)

Вывод:

[('SQL', '1'), ('SQL', '2'), ('SQL', '3'), ('SQL', '4'), ('SQL', '5'), ('ORACLE', '2'), ('ORACLE', '5'), ('ORACLE', '6'), ('ORACLE', '7')]

Если вы хотите собрать их в список строк в указанном вами формате,просто замените

res.extend((key, v) for v in values[1:])

на

res.extend('{},{}'.format(key, v) for v in values[1:])
...