Я создал простую таблицу в Снежинке:
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:
- перенос
CONTINUE
с одинарными кавычками не помогает - в нижнем регистре не помогает
- на самом деле мне не нужно ПРОДОЛЖИТЬ, мне нужно
SKIP_FILE_<num>
, однако это не работает и с JSON. - на самом деле мы используем avro в производственной среде, поэтому это более актуально. Я использую
JSON
для тестов, потому что это проще.