Как загрузить на Snowflake JSON с буквенным экранирующим символом Unicode "\\ uNo" - PullRequest
0 голосов
/ 09 октября 2019

У меня есть следующий JSON:

{
  "name": "foo \\uNo bar"
}

Я пытаюсь загрузить это в Snowflake, используя STAGE на S3. Это в CSV-файле, например:

{"name": "foo \\uNo bar"}

Однако, когда я пытаюсь загрузить его, Snowflake обрывается с сообщением JSON об ошибке разбора. Если я пытаюсь загрузить его непосредственно на консоль Snowflake, как SELECT PARSE_JSON('{"name": "foo \\uNo bar"}'), я получаю:

Ошибка синтаксического анализа JSON: в \ u ???? ожидается шестнадцатеричное числоescape escape, pos 17

Проблема в том, что Snowflake анализирует строку, проверяя наличие цифры Unicode \uNo (которая не существует). Как я могу отключить это?

1 Ответ

1 голос
/ 10 октября 2019

ФОРМАТ ФАЙЛА по умолчанию для синтаксического анализа CSV в Snowflake интерпретирует двойную строку с обратной косой чертой '{"name": "foo \\uNo bar"}' как escape-последовательность для символа \, что означает, что последовательность символов \uNo передается в PARSE_JSON, которая затем завершается неудачей, потому что \uNo недопустимая escape-последовательность для строки JSON. Вы можете предотвратить это, переопределив параметры escape-последовательности FILE FORMAT.

Для данного CSV-файла:

JSON
'{"name": "foo \\uNo bar"}'

И следующих операторов CREATE TABLE и COPY INTO:

CREATE OR REPLACE TABLE JSON_TEST (JSON TEXT);

COPY INTO JSON_TEST
FROM @my_db.public.my_s3_stage/json.csv
FILE_FORMAT = (TYPE = CSV
               SKIP_HEADER = 1
               FIELD_OPTIONALLY_ENCLOSED_BY = '\''
               ESCAPE = NONE
               ESCAPE_UNENCLOSED_FIELD = NONE);

Я могу проанализировать результат как JSON:

SELECT PARSE_JSON(JSON) FROM JSON_TEST;

, который возвращает

+-----------------------------+
| JSON                        |
+-----------------------------|
| { "name": "foo \\uNo bar" } |
+-----------------------------+
...