Почему dask.bag.read_text (имя файла) .map (json.loads) возвращает список? - PullRequest
0 голосов
/ 19 сентября 2019

Мне нужно прочитать несколько файлов json.gz, используя Dask.Я пытаюсь добиться этого с помощью dask.bag.read_text (имя файла) .map (json.loads), но вывод представляет собой вложенный список (файлы содержат списки словарей), в то время как я хотел бы получить просто списоксловарей.

Ниже приведен небольшой пример, который воспроизводит мою проблему.

import json 
import gzip
import dask.bag as db

dict_list = [{'id': 123, 'name': 'lemurt', 'indices': [1,10]}, {'id': 345, 'name': 'katin', 'indices': [2,11]}]

filename = './test.json.gz'

# Write json
with gzip.open(filename, 'wt') as write_file:
    json.dump(dict_list , write_file)

# Read json
with gzip.open(filename, "r") as read_file:
    data = json.load(read_file)

# Read json with Dask 
data_dask = db.read_text(filename).map(json.loads).compute()

print(data)
print(data_dask)

Я хотел бы получить первый вывод:

[{'id': 123, 'name': 'lemurt', 'indices': [1, 10]}, {'id': 345, 'name': 'katin', 'indices': [2, 11]}]

Но вместо этого я получаювторой:

[[{'id': 123, 'name': 'lemurt', 'indices': [1, 10]}, {'id': 345, 'name': 'katin', 'indices': [2, 11]}]]

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

После комментария @MRocklin я решил свою проблему, изменив способ записи файлов json.gz.

Вместо

with gzip.open(filename, 'wt') as write_file:
    json.dump(dict_list , write_file)

Я использовал

with gzip.open(filename, 'wt') as write_file:
    for dd in dict_list:
        json.dump(dd , write_file)
        write_file.write("\n")

и продолжал читать файлы как

db.read_text(filename).map(json.loads)
0 голосов
/ 21 сентября 2019

Функция read_text возвращает мешок, где каждый элемент представляет собой строку текста.Итак, у вас есть список строк.Затем вы анализируете каждую из этих строк текста с помощью json.loads, поэтому каждая из этих строк текста снова становится списком.Итак, у вас есть список списков.

В вашем случае вы можете использовать map_partitions и функцию, которая ожидает список из одной строки текста

b = db.read_text("*.json.gz").map(lambda L: json.loads(L[0]))
...