0

我有一个以下格式的输入数据,我正在尝试拆分并创建一个键值对:

输入:

"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)
4

2 回答 2

0

使用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(',')然后将第二项拆分为一个新列表
  3. 具有 (k, v) 元组的列表推导将被展平flatMap()
于 2019-05-05T02:50:18.533 回答
0

输入数据:

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:])
于 2019-05-04T18:26:38.433 回答