• XSS.stack #1 – первый литературный журнал от юзеров форума

Загрузка JSON файла во временную таблицу

Marcus Aurelius

HDD-drive
Пользователь
Регистрация
02.04.2021
Сообщения
27
Реакции
79
В наличии "big.json" размером около 70 Гб, представляет собой один объект {}.

Структура JSON:
JSON:
{
    "entity_name": "Cars",
    "entity_type": "Manual",
    "last_updated_on": "2023-04-01",
    "version": "1.0.0",
    "model_name": null,
    "model_id_type": null,
    "model_id": null,
    "model_market_type": null,
    "provider_references": null,
    "body": [{
                "negotiation_arrangement": "bundle",
                "name": "Narrative not found",
                "billing_code_type": "CPT",
                "billing_code_type_version": "2022",
                "billing_code": "Y3600",
                "description": "Narrative not found",
                "negotiated_rates": [{
                        "provider_groups": [{
                            "npi": [
                                1083010953
                            ],
                            "tin": {
                                "type": "ein",
                                "value": "47-1161992"
                            }
                        }],
                        "negotiated_prices": [{
                            "negotiated_type": "derived",
                            "negotiated_rate": 100.02,
                            "expiration_date": "9999-12-31",
                            "service_code": [
                                "19",
                                "22",
                                "23"
                            ],
                            "billing_class": "institutional"
                        }]
                    },
                    {
                        "provider_groups": [{
                            "npi": [
                                1962402354
                            ],
                            "tin": {
                                "type": "ein",
                                "value": "13-4257646"
                            }
                        }],
                        "negotiated_prices": [{
                            "negotiated_type": "derived",
                            "negotiated_rate": 100.09,
                            "expiration_date": "9999-12-31",
                            "service_code": [
                                "19",
                                "22",
                                "23"
                            ],
                            "billing_class": "institutional"
                        }]
                    }
                ]
            }
]}

Основная часть файла, 99.99999999 хранится в "body".

Подскажите, пожалуйста, каким образом можно загрузить данный файл во временную таблицу (PostgreSQL), либо облачное решение (Snowflake). Вся сложность заключается в структуре файла, в память файл нет смысла записывать. Пытался использовать библиотеку ijson для итеративного чтения и разбивки на более мелкие, но если и разбивать, то как? По сути это отчетные данные одной компании.

Думал, разбить файл на более мелкие, после или сконвертировать в CSV или в JSON виде осуществить параллельную загрузку.

Но не понимаю каким образом это наиболее эффективно сделать и менее затратно по времени (в первую очередь), по ресурсам.
 
It is not that hard to write a simple converter for this at all, like very very easy. Hardest part of that will just be copy/paste all of the field names to the end database. Or if willing to spend a little bit more time, cloning structure into result database can be automated too. When you tried to write convertor to put data in SQL database, what was the issue/problem for you?
 
It is not that hard to write a simple converter for this at all, like very very easy. Hardest part of that will just be copy/paste all of the field names to the end database. Or if willing to spend a little bit more time, cloning structure into result database can be automated too. When you tried to write convertor to put data in SQL database, what was the issue/problem for you?
1) как это все разбить оптимально
2) каким образом загрузить в базу

по сути файл, это 1 строка в базе я думаю, и нужно каким-то образом его загрузить.

структура таблица также не ясна, так как присутствуют вложенные структуры.
 
1) как это все разбить оптимально
2) каким образом загрузить в базу

по сути файл, это 1 строка в базе я думаю, и нужно каким-то образом его загрузить.

структура таблица также не ясна, так как присутствуют вложенные структуры.

What I would do is just write a simple PHP script, and run it from console using: "php convet_script.php".

I would store the data into MySQL Database, and structure can be copied from JSON. And for multi-dimensional arrays you have there you can either just use "serialize()/unserialize()", or create a new separate database table and just use indexes. That really depends on what are you trying to do with it. If either to just store data for later, or you want to operate it with different functions (like to select all specific model_names, etc).

With PHP you just have to convert JSON to Array. Loop though all elements of it, and make a simple query to put data into database. That is it. By your reply I assume you currently have 0 coding knowledge yourself?
 
В наличии "big.json" размером около 70 Гб, представляет собой один объект {}.

Структура JSON:
JSON:
{
    "entity_name": "Cars",
    "entity_type": "Manual",
    "last_updated_on": "2023-04-01",
    "version": "1.0.0",
    "model_name": null,
    "model_id_type": null,
    "model_id": null,
    "model_market_type": null,
    "provider_references": null,
    "body": [{
                "negotiation_arrangement": "bundle",
                "name": "Narrative not found",
                "billing_code_type": "CPT",
                "billing_code_type_version": "2022",
                "billing_code": "Y3600",
                "description": "Narrative not found",
                "negotiated_rates": [{
                        "provider_groups": [{
                            "npi": [
                                1083010953
                            ],
                            "tin": {
                                "type": "ein",
                                "value": "47-1161992"
                            }
                        }],
                        "negotiated_prices": [{
                            "negotiated_type": "derived",
                            "negotiated_rate": 100.02,
                            "expiration_date": "9999-12-31",
                            "service_code": [
                                "19",
                                "22",
                                "23"
                            ],
                            "billing_class": "institutional"
                        }]
                    },
                    {
                        "provider_groups": [{
                            "npi": [
                                1962402354
                            ],
                            "tin": {
                                "type": "ein",
                                "value": "13-4257646"
                            }
                        }],
                        "negotiated_prices": [{
                            "negotiated_type": "derived",
                            "negotiated_rate": 100.09,
                            "expiration_date": "9999-12-31",
                            "service_code": [
                                "19",
                                "22",
                                "23"
                            ],
                            "billing_class": "institutional"
                        }]
                    }
                ]
            }
]}

Основная часть файла, 99.99999999 хранится в "body".

Подскажите, пожалуйста, каким образом можно загрузить данный файл во временную таблицу (PostgreSQL), либо облачное решение (Snowflake). Вся сложность заключается в структуре файла, в память файл нет смысла записывать. Пытался использовать библиотеку ijson для итеративного чтения и разбивки на более мелкие, но если и разбивать, то как? По сути это отчетные данные одной компании.

Думал, разбить файл на более мелкие, после или сконвертировать в CSV или в JSON виде осуществить параллельную загрузку.

Но не понимаю каким образом это наиболее эффективно сделать и менее затратно по времени (в первую очередь), по ресурсам.
по объектам в массиве negotiated_rates, они похоже повторяются и имею одинковую структуру
 
В наличии "big.json" размером около 70 Гб, представляет собой один объект {}.

Структура JSON:
JSON:
{
    "entity_name": "Cars",
    "entity_type": "Manual",
    "last_updated_on": "2023-04-01",
    "version": "1.0.0",
    "model_name": null,
    "model_id_type": null,
    "model_id": null,
    "model_market_type": null,
    "provider_references": null,
    "body": [{
                "negotiation_arrangement": "bundle",
                "name": "Narrative not found",
                "billing_code_type": "CPT",
                "billing_code_type_version": "2022",
                "billing_code": "Y3600",
                "description": "Narrative not found",
                "negotiated_rates": [{
                        "provider_groups": [{
                            "npi": [
                                1083010953
                            ],
                            "tin": {
                                "type": "ein",
                                "value": "47-1161992"
                            }
                        }],
                        "negotiated_prices": [{
                            "negotiated_type": "derived",
                            "negotiated_rate": 100.02,
                            "expiration_date": "9999-12-31",
                            "service_code": [
                                "19",
                                "22",
                                "23"
                            ],
                            "billing_class": "institutional"
                        }]
                    },
                    {
                        "provider_groups": [{
                            "npi": [
                                1962402354
                            ],
                            "tin": {
                                "type": "ein",
                                "value": "13-4257646"
                            }
                        }],
                        "negotiated_prices": [{
                            "negotiated_type": "derived",
                            "negotiated_rate": 100.09,
                            "expiration_date": "9999-12-31",
                            "service_code": [
                                "19",
                                "22",
                                "23"
                            ],
                            "billing_class": "institutional"
                        }]
                    }
                ]
            }
]}

Основная часть файла, 99.99999999 хранится в "body".

Подскажите, пожалуйста, каким образом можно загрузить данный файл во временную таблицу (PostgreSQL), либо облачное решение (Snowflake). Вся сложность заключается в структуре файла, в память файл нет смысла записывать. Пытался использовать библиотеку ijson для итеративного чтения и разбивки на более мелкие, но если и разбивать, то как? По сути это отчетные данные одной компании.

Думал, разбить файл на более мелкие, после или сконвертировать в CSV или в JSON виде осуществить параллельную загрузку.

Но не понимаю каким образом это наиболее эффективно сделать и менее затратно по времени (в первую очередь), по ресурсам.
https://www.gunamoi.com.au/soft/savejson2csv/index.html есть такой замечательный инструмент, который json разбивает в csv, есть вариант с cmd. Потом уже проблем никаких не будет
 
Для загрузки данных из файла JSON во временную таблицу PostgreSQL или облачное решение Snowflake вы можете использовать инструменты, специализированные на обработке крупных файлов JSON, такие как AWS Glue, Apache Spark или Snowflake Copy.

Если вы хотите использовать ijson для обработки файла, вы можете разбить файл на более мелкие части и итеративно загрузить их во временную таблицу или облачное хранилище данных. Вы можете использовать Python для чтения файла JSON и записи его содержимого в базу данных. Например:

1. Установите библиотеки `psycopg2` или `snowflake-connector-python`
2. Используйте ijson, чтобы читать большой JSON-файл по частям и добавлять данные в PostgreSQL или Snowflake.
3. Определите структуру таблицы и создайте соответствующую схему в базе данных.
4. Проходите по вашему JSON-файлу и для каждого элемента body вставьте соответствующие данные в созданную таблицу.

Пример использования ijson в Python для чтения из файла JSON и записи в PostgreSQL:

```python
import psycopg2
import ijson

# подключение к базе данных
conn = psycopg2.connect(database="my_database", user="my_user", password="my_password", host="my_host", port="my_port")
cur = conn.cursor()

# определение SQL-запроса на создание таблицы
create_table_query = '''
CREATE TABLE IF NOT EXISTS cars(
entity_name TEXT,
entity_type TEXT,
last_updated_on DATE,
version TEXT,
model_name TEXT,
model_id_type TEXT,
model_id TEXT,
model_market_type TEXT,
provider_references TEXT,
negotiation_arrangement TEXT,
name TEXT,
billing_code_type TEXT,
billing_code_type_version TEXT,
billing_code TEXT,
description TEXT,
provider_groups TEXT,
npi TEXT,
tin TEXT,
negotiated_prices TEXT,
negotiated_type TEXT,
negotiated_rate FLOAT,
expiration_date DATE,
service_code TEXT,
billing_class TEXT,
);
'''

# создание таблицы
cur.execute(create_table_query)

# чтение из JSON-файла и запись в базу данных
with open('big.json', 'rb') as f:
parser = ijson.parse(f)
for prefix, event, value in parser:
if prefix == 'body.item.negotiation_arrangement':
negotiation_arrangement = value
elif prefix == 'body.item.name':
name = value
elif prefix == 'body.item.billing_code_type':
billing_code_type = value
elif prefix == 'body.item.billing_code_type_version':
billing_code_type_version = value
elif prefix == 'body.item.billing_code':
billing_code = value
# ...
elif prefix == 'body.item.negotiated_rates.item.provider_groups':
provider_groups = value
npi = provider_groups[0]['npi'][0]
tin = provider_groups[0]['tin']['value']
elif prefix == 'body.item.negotiated_rates.item.negotiated_prices':
negotiated_prices = value
negotiated_type = negotiated_prices[0]['negotiated_type']
negotiated_rate = negotiated_prices[0]['negotiated_rate']
expiration_date = negotiated_prices[0]['expiration_date']
service_code = str(negotiated_prices[0]['service_code'])
billing_class = negotiated_prices[0]['billing_class']

# SQL-запрос на запись данных в таблицу
insert_query = f'''
INSERT INTO cars(entity_name, entity_type, last_updated_on, version, model_name, model_id_type, model_id, model_market_type, provider_references, negotiation_arrangement, name,
billing_code_type, billing_code_type_version, billing_code, description, provider_groups, npi, tin, negotiated_prices, negotiated_type, negotiated_rate,
expiration_date, service_code, billing_class)
VALUES
('{entity_name}', '{entity_type}', '{last_updated_on}', '{version}', '{model_name}', '{model_id_type}', '{model_id}', '{model_market_type}', '{provider_references}', '{negotiation_arrangement}', '{name}',
'{billing_code_type}', '{billing_code_type_version}', '{billing_code}', '{description}', '{provider_groups}', '{npi}', '{tin}', '{negotiated_prices}', '{negotiated_type}', '{negotiated_rate}',
'{expiration_date}', '{service_code}', '{billing_class}');
'''
# запись данных в таблицу
cur.execute(insert_query)

# коммит изменений и закрытие подключения
conn.commit()
cur.close()
conn.close()
```

Чтобы загрузить данные в Snowflake, вы можете использовать команду COPY, которая позволяет загружать данные из файла JSON в выбранную вами таблицу. Для этого вам необходимо создать таблицу в Snowflake и настроить формат файла JSON для загрузки. Это можно сделать следующим образом:

1. Создайте таблицу в Snowflake с помощью SQL-запроса

2. Настройте формат файла JSON при использовании COPY-команды Snowflake. Пример:

```
COPY INTO CARS
FROM 'SnowFlake/my_stage/big.json'
FILE_FORMAT=(
TYPE=JSON
COMPRESSION=GZIP
STRIP_OUTER_ARRAY = TRUE
STRIP_NULL_VALUES = TRUE
)
```

Обратите внимание, что вам также необходимо создать `stage` в Snowflake, где вы будете хранить файл JSON.

С помощью команды COPY Snowflake может загрузить данные из файла JSON в таблицу без предварительной обработки файла в Python или другом языке программирования. Это может сэкономить время и ресурсы, поскольку Snowflake автоматически оптимизирует процесс загрузки данных.

Кроме того, вы можете использовать Apache Spark для обработки JSON-файла и загрузки данных в базу данных. Apache Spark предоставляет интуитивно понятные API для работы с данными JSON и взаимодействия с базами данных.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх