Чтение большого JSON файла с Python Dask вызывает ошибку разделителя - PullRequest
1 голос
/ 12 апреля 2020

Я пытаюсь прочитать JSON файл размером ~ 12 ГБ. Я скачал из набора данных AMiner Citation Network V12 отсюда . Это пример, где я удалил пару полей, из-за которых JSON слишком длинный.

[{"id":1091,"authors":[{"name":"Makoto Satoh","org":"Shinshu University","id":2312688602},{"name":"Ryo Muramatsu","org":"Shinshu University","id":2482909946},{"name":"Mizue Kayama","org":"Shinshu University","id":2128134587},{"name":"Kazunori Itoh","org":"Shinshu University","id":2101782692},{"name":"Masami Hashimoto","org":"Shinshu University","id":2114054191},{"name":"Makoto Otani","org":"Shinshu University","id":1989208940},{"name":"Michio Shimizu","org":"Nagano Prefectural College","id":2134989941},{"name":"Masahiko Sugimoto","org":"Takushoku University, Hokkaido Junior College","id":2307479915}],"title":"Preliminary Design of a Network Protocol Learning Tool Based on the Comprehension of High School Students: Design by an Empirical Study Using a Simple Mind Map","year":2013,"n_citation":1,"page_start":"89","page_end":"93","doc_type":"Conference","publisher":"Springer, Berlin, Heidelberg","volume":"","issue":"","doi":"10.1007/978-3-642-39476-8_19","references":[2005687710,2018037215],"fos":[{"name":"Telecommunications network","w":0.45139},{"name":"Computer science","w":0.45245},{"name":"Mind map","w":0.5347},{"name":"Humanâcomputer interaction","w":0.47011},{"name":"Multimedia","w":0.46629},{"name":"Empirical research","w":0.49737},{"name":"Comprehension","w":0.47042},{"name":"Communications protocol","w":0.51907}],"venue":{"raw":"International Conference on Human-Computer Interaction","id":1127419992,"type":"C"}}
,{"id":1388,"authors":[{"name":"Pranava K. Jha","id":2718958994}],"title":"Further Results on Independence in Direct-Product Graphs.","year":2000,"n_citation":1,"page_start":"","page_end":"","doc_type":"Journal","publisher":"","volume":"56","issue":"","doi":"","fos":[{"name":"Graph","w":0.0},{"name":"Discrete mathematics","w":0.45872},{"name":"Combinatorics","w":0.4515},{"name":"Direct product","w":0.59104},{"name":"Mathematics","w":0.42784}],"venue":{"raw":"Ars Combinatoria","id":73158690,"type":"J"}}
,{"id":1674,"authors":[{"name":"G. Beale","org":"Archaeological Computing Research Group, University of Southampton, UK#TAB#","id":2103626414},{"name":"G. Earl","org":"Archaeological Computing Research Group, University of Southampton, UK#TAB#","id":2117665592}],"title":"A methodology for the physically accurate visualisation of roman polychrome statuary","year":2011,"n_citation":1,"page_start":"137","page_end":"144","doc_type":"Conference","publisher":"Eurographics Association","volume":"","issue":"","doi":"10.2312/VAST/VAST11/137-144","references":[1535888970,1992876689,1993710814,2035653341,2043970887,2087778487,2094478046,2100468662,2110331535,2120448006,2138624212,2149970020,2150266006,2296384428,2403283736],"fos":[{"name":"Statue","w":0.40216},{"name":"Engineering drawing","w":0.43427},{"name":"Virtual reconstruction","w":0.0},{"name":"Computer science","w":0.42062},{"name":"Visualization","w":0.4595},{"name":"Polychrome","w":0.4474},{"name":"Artificial intelligence","w":0.40496}],"venue":{"raw":"International Conference on Virtual Reality","id":2754954274,"type":"C"}}]

Когда я пытаюсь прочитать файл с помощью Python Dask (я не могу открыть его, как любой другой файл слишком большой, и я получаю ошибку ограничения памяти)

import dask.bag as db

if __name__ == '__main__':
    b = db.read_text('dblp.v12.json').map(json.loads)
    print(b.take(4))

Я получаю следующую ошибку:

JSONDecodeError: Expecting ',' delimiter

Я проверил приведенный выше пример в онлайн-валидаторе, и он прошел. Итак, я думаю, что это не ошибка в JSON, а что-то в Dask и как я должен прочитать файл.

1 Ответ

0 голосов
/ 12 апреля 2020

Кажется, что dask передает каждую строку вашего файла отдельно json.loads. Я удалил разрывы строк в вашем образце и смог загрузить данные.

Конечно, выполнение всего этого файла и отправка одного JSON объекта на json.loads отрицательно скажется на цели использования dask.

Одним из возможных решений (хотя я не уверен, насколько это масштабируемо для очень больших файлов) является использование jq для преобразования вашего JSON файла в JSON строки - путем записи каждого элемента Ваш root JSON массив в одну строку в файле:

jq -c '.[]' your.json > your.jsonl

Затем вы можете загрузить его с помощью dask:

import dask.bag as db
import json
json_file = "your.jsonl"
b = db.read_text(json_file).map(json.loads)
print(b.take(4))
...