如何在Dask中进行Spark爆炸?

时间:2017-09-11 18:05:21

标签: python json pyspark dask

我是新来的,所以请耐心等待。

我有一个JSON文件,其中每一行都有以下架构:

{
 'id': 2,
 'version': 7.3,
 'participants': range(10)
}

参与者是一个嵌套的领域。

input_file = 'data.json'   
df = db.read_text(input_file).map(json.loads)

我可以做任何一件事:
    df.pluck(['id', 'version'])

    df.pluck('participants').flatten()

但是我怎样才能做同样的Spark爆炸,我可以同时选择idversion并展平participants

所以输出结果为:

{'id': 2, 'version': 7.3, 'participants': 0}
{'id': 2, 'version': 7.3, 'participants': 1}
{'id': 2, 'version': 7.3, 'participants': 2}
{'id': 2, 'version': 7.3, 'participants': 3}
...

1 个答案:

答案 0 :(得分:0)

可以编写自定义函数来读取&使用dask.bag.from_sequence

转换文件行
def mapper(row, denest_field):
    js = json.loads(row)
    for v in js[denest_field]:
        yield {'id': js['id'], denest_field: v, 'version': js['version']}


def yield_unnested(fname, denest_field):
    with open (fname) as f:
        for row in f:
            yield from mapper(row, denest_field)

我已保存名为'data.json'的文件,其中包含以下内容

{"id": 2, "version": 7.3, "participants": [0,1,2,3,4,5,6,7,9,9]}

然后阅读from_sequence

df = db.from_sequence(yield_unnested('data.json', 'participants'))
list(df) # outputs:

[{'id': 2, 'participants': 0, 'version': 7.3},
 {'id': 2, 'participants': 1, 'version': 7.3},
 {'id': 2, 'participants': 2, 'version': 7.3},
 {'id': 2, 'participants': 3, 'version': 7.3},
 {'id': 2, 'participants': 4, 'version': 7.3},
 {'id': 2, 'participants': 5, 'version': 7.3},
 {'id': 2, 'participants': 6, 'version': 7.3},
 {'id': 2, 'participants': 7, 'version': 7.3},
 {'id': 2, 'participants': 9, 'version': 7.3},
 {'id': 2, 'participants': 9, 'version': 7.3}]

请注意,我是dask的新手,这可能不是最有效的方法。