РЕКОМЕНДАЦИЯ № 1:
Проблема с вашим JSON состоит в том, что у него нет внешнего массива. У него есть один внешний объект, содержащий свойство с внутренним массивом.
Если вы можете исправить JSON, это будет лучшим решением, и тогда STRIP_OUTER_ARRAY будет работать так, как вы ожидаете.
ВыМожно также попытаться изменить JSON (уродливый бизнес) после прочтения строки для строки с:
CREATE OR REPLACE TABLE X (CLIENT VARCHAR);
COPY INTO X FROM (SELECT $1 CLIENT FROM @My_Stage/Client.json);
Ответ пользователя на Рекомендацию № 1:
Спасибо. Итак, из того, что я понял, COPY with STRIP_OUTER_ARRAY
может обрабатывать файл, начинающийся и заканчивающийся квадратными скобками, и анализировать файл, как если бы его там не было.
В реальных файлах нет разрывов строк, поэтому я могучитать файл построчно. Я посмотрю, может ли исходная система изменить экспорт.
РЕКОМЕНДАЦИЯ № 2:
Также, если вы хотите увидетьЧто делает анализатор JSON, вы можете поэкспериментировать с этим кодом. Я проанализировал JSON в команде копирования с использованием аналогичного кода. Работа с данными JSON в небольшом проекте может помочь вам настроить команду «Копировать» для правильной работы.
CREATE OR REPLACE TABLE SAMPLE_JSON
(ID INTEGER,
DATA VARIANT
);
INSERT INTO SAMPLE_JSON(ID,DATA)
SELECT
1,parse_json('{
"Client": [
{
"ClientNo": 1,
"ClientName": "Alpha",
"ClientBusiness": [
{
"BusinessNo": 1,
"IndustryCode": "12345"
},
{
"BusinessNo": 2,
"IndustryCode": "23456"
}
]
},
{
"ClientNo": 2,
"ClientName": "Bravo",
"ClientBusiness": [
{
"BusinessNo": 1,
"IndustryCode": "34567"
},
{
"BusinessNo": 2,
"IndustryCode": "45678"
}
]
}
]
}');
SELECT
C.value:ClientNo AS ClientNo
,C.value:ClientName::STRING AS ClientName
,ClientBusiness.value:BusinessNo::Integer AS BusinessNo
,ClientBusiness.value:IndustryCode::Integer AS IndustryCode
from SAMPLE_JSON f
,table(flatten( f.DATA,'Client' )) C
,table(flatten(c.value:ClientBusiness,'')) ClientBusiness;
Ответ пользователя на Рекомендацию № 2:
Спасибо за пример parse_json!
Проблема в том, что реальные файлы иногда имеют размер 500 МБ, поэтому функция parse_json задыхается.
Выполнение рекомендации № 2:
JSON должен быть в формате NDJSON http://ndjson.org/. В противном случае JSON будет невозможно проанализировать из-за возможности больших файлов.
Надеюсь, что вышеизложенное помогает другим сталкиваться с подобными вопросами!