Параметр ON_ERROR у меня не работает с JSON файлами - PullRequest
0 голосов
/ 26 марта 2020

Я создал простую таблицу в Снежинке:

Column name    Type
S              VARCHAR
N              NUMBER

Оба столбца обнуляются. Теперь я хочу загрузить частично плохой результат в таблицу из файлов CSV и JSON.

CSV

s, n
hello, 1
bye, 2
nothing, zero

Третья строка "плохая": ее второй элемент не число. Команда, которую я использую для загрузки этого файла:

"COPY INTO "DEMO_DB"."PUBLIC"."TEST5" FROM @my_s3_stage1 files=('2good-1bad.csv') file_format = (type = csv field_delimiter = ',' skip_header = 1) ON_ERROR = CONTINUE;

Брошенный SnowflakeSQLException:

errorCode = 200038 
SQLState = 0A000 
message: Cannot convert value in the driver from type:12 to type:int, value=PARTIALLY_LOADED.

Две "хорошие" строки записаны в таблицу; «плохой» игнорируется. Этот результат ожидается.

Однако, когда я использую следующий JSON файл строк:

{"s":"hello", "n":1}
{"s":"bye", "n":2}
{"s":"nothing", "n":"zero"}

с этой командой:

COPY INTO "DEMO_DB"."PUBLIC"."TEST5" FROM @my_s3_stage1 files=('2good-1bad.json') file_format = (type = json) 
MATCH_BY_COLUMN_NAME=CASE_INSENSITIVE 
ON_ERROR = CONTINUE

Я получаю следующее SnowflakeSQLException:

errorCode = 100071 
SQLState = 22000 
message: Failed to cast variant value "zero" to FIXED

и в БД ничего не пишется.

Вопрос "Что не так?" Почему ON_ERROR = CONTINUE не работает с моим JSON файлом?

PS:

  1. перенос CONTINUE с одинарными кавычками не помогает
  2. в нижнем регистре не помогает
  3. на самом деле мне не нужно ПРОДОЛЖИТЬ, мне нужно SKIP_FILE_<num>, однако это не работает и с JSON.
  4. на самом деле мы используем avro в производственной среде, поэтому это более актуально. Я использую JSON для тестов, потому что это проще.

1 Ответ

1 голос
/ 27 марта 2020

Вы правы, что on_error не поддерживается с форматами файлов, отличных от CSV. Я видел людей с файлами, которые могут обойти эту проблему, указав тип файла CSV с FIELD_DELIMITER = 'none'.

Я видел запрос пары людей, чтобы эта опция работала для полуструктурированных файлов, и вы можете также отправить запрос на функцию, чтобы создать больше спроса на него: https://community.snowflake.com/s/ideas

Документация на самом деле не гласит, что она не поддерживается (не стесняйтесь отправлять отзывы на документы, используя кнопку внизу), но вы можете увидеть, что она намекает на: https://docs.snowflake.com/en/sql-reference/sql/copy-into-table.html

"Вы можете использовать соответствующий формат файла (например, JSON), но любая ошибка в преобразовании остановит операцию COPY, даже если вы установили опцию ON_ERROR для продолжения или пропуска файла."

...