У меня есть CSV-файл, один из столбцов которого, json_dic
, содержит сложный JSON со множеством вложенных полей в списках в словарях и т. Д.
Как лучше всего загрузить этот файл вБаза данных Postgres, чтобы я мог обращаться к определенным полям и искать их и получать эти данные из SQL-запроса?
Например, у меня есть миллионы строк следующего содержания:
![enter image description here](https://i.stack.imgur.com/IvqjK.png)
Столбец JSON json_doc
выглядит следующим образом, но он не соответствует другим строкам, т. Е. Есть другие вложенные словари в разных местах и т. Д .:
{"id": "0436d9b9305d", "base": {"ateco": [{"code": "46.11.03", "rootCode": "G", "description": "Agenti e rappresentanti di animali vivi"}], "founded": "1972-07-10", "legalName": "COBEM - S.R.L.", "legalForms": [{"name": "Società Di Capitale", "level": 1}, {"name": "Società A Responsabilità Limitata", "level": 2}]}, "name": "COBEM - S.R.L.", "people": {"items": [{"name": "45808b0b5b5affa871c8e91169bb10c6930fac56", "givenName": "64e4393f477394f11f6477ca76395ed469548865", "familyName": "68ee44f14dc54d664dffe63195d42a14988b69bb"}]}, "country": "it", "locations": {}}
Как я могу загрузить это, либо вэто текущая форма CSV или в формате JSON для PostgreSQL?Я искал ответ в течение нескольких дней, но ничего не получил.Я пытался использовать COPY, использовать pandas, json_normalize
и т. Д. Я хочу иметь возможность выполнить объединение, чтобы сопоставить, например, идентификационные номера с другой таблицей, а затем извлечь информацию из этого сложного файла.Это вообще возможно?
Одна из моих попыток:
import csv
import json
csvfile = open('sample.csv', 'r')
jsonfile = open('data.json', 'w')
reader = csv.DictReader(csvfile)
i = 0
for row in reader:
if i < 3:
json.dump(row, jsonfile)
i+=1
else:
break
А потом в моем терминале psql:
SN_ITA_test=# \COPY public."ITA_test" FROM 'data.json';
Выход:
ERROR: extra data after last expected column
CONTEXT: COPY ITA_test, line 1: "{"id": "4002736", "json_doc": "{\"id\": \"0436d9b9305d\", \"base\": {\"ateco\": [{\"code\": \"46.11...."