我有以下格式的输入数据,我正在尝试拆分并创建键值对:
输入:
"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)
答案 0 :(得分:0)
输入数据:
class Foo
{
private:
String _user;
String _key;
public:
/*constructors and etc*/
void fromJson(String json)
{
DynamicJsonBuffer jsonBuffer;
JsonObject &root = jsonBuffer.parseObject(json);
if (!root.success())
{
Serial.println("Falled fromJson!");
return;
}
const char *tmp;
tmp = root["user"];
_user = String(tmp); // work correct
tmp = root["key"];
_key = String(tmp); // return null every time
}
}
代码:
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:])
答案 1 :(得分: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')]
位置:
[row.replace('"','').split(',', 1)]
将类似"SQL",1,2,3,4,5
的行转换为两个元素SQL
和1,2,3,4,5
的列表vs.split(',')
然后将第二项拆分为新列表flatMap()
压平