拆分句子并按键将每个值分组

时间:2019-05-04 17:39:31

标签: python python-3.x lambda pyspark rdd

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

输入:

"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 :(得分: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')]

位置:

  1. [row.replace('"','').split(',', 1)]将类似"SQL",1,2,3,4,5的行转换为两个元素SQL1,2,3,4,5的列表
  2. vs.split(',')然后将第二项拆分为新列表
  3. 具有(k,v)元组的列表理解将被flatMap()压平