Свести источник данных в Snowflake из массива - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь исправить массив в наборе данных. В настоящее время у меня есть набор данных, который имеет ссылочный номер для нескольких различных UUID. Что я хотел бы сделать, так это сгладить это в Snowflake, чтобы ссылочный номер имел отдельный ряд для каждого uuid. Например,

Reference                                       UUID
1) 9f823c2a-ced5-4dbe-be65-869311462f75 "[
                                         ""05554f65-6aa9-4dd1-6271-8ce2d60f10c4"",
                                         ""df662812-7f97-0b43-9d3e-12f64f504fbb"",
                                          ""08644a69-76ed-ce2d-afff-b236a22efa69"",
                                          ""f1162c2e-eeb5-83f6-5307-2ed644e6b9eb"",
                                            ]"

Должно получиться так:

Reference                                UUID
1) 9f823c2a-ced5-4dbe-be65-869311462f75    05554f65-6aa9-4dd1-6271-8ce2d60f10c4
2) 9f823c2a-ced5-4dbe-be65-869311462f75    df662812-7f97-0b43-9d3e-12f64f504fbb
3) 9f823c2a-ced5-4dbe-be65-869311462f75    08644a69-76ed-ce2d-afff-b236a22efa69
4) 9f823c2a-ced5-4dbe-be65-869311462f75    f1162c2e-eeb5-83f6-5307-2ed644e6b9eb

Я только начал работать в Snowflake, поэтому я новичок в этом. Похоже, что есть боковое сглаживание, но это либо не работает, чтобы сказать мне, что у меня есть все виды ошибок с ним. Документация от снежинки немного озадачивает, когда дело доходит до этого.

1 Ответ

2 голосов
/ 24 января 2020

В то время как FLATTEN - правильный подход при разборе массива, значение столбца UUID, показанное в исходном описании, недопустимо , если интерпретируется как JSON синтаксис : "[""val1"", ""val2""]", и это потребует исправления, прежде чем можно будет применить подход LATERAL FLATTEN, рассматривая его как тип VARIANT.

Если ваша выборка данных в исходном описании является литеральной и применяется ко всем столбчатым значения, то следующий запрос поможет преобразовать его в действительный синтаксис JSON, а затем применить боковое выравнивание для получения желаемого результата:

SELECT
  T.REFERENCE,
  X.VALUE AS UUID
FROM (
  SELECT
    REFERENCE,
    -- Attempts to transform an invalid JSON array syntax such as "[""a"", ""b""]"
    -- to valid JSON: ["a", "b"] by stripping away unnecessary quotes
    PARSE_JSON(REPLACE(REPLACE(REPLACE(UUID, '""', '"'), '["', '['), ']"', ']')) AS UUID_ARR_CLEANED
    FROM TABLENAME) T,
  LATERAL FLATTEN(T.UUID_ARR_CLEANED) X

Если ваши данные уже имеют допустимый тип VARIANT при успешном выполнении PARSE_JSON для столбца UUID во время загрузки, и приведенный в описании пример был просто проблемой форматирования, которая отображает только недопустимое значение JSON в сообщении, а затем более простую версию того же запроса, что и выше. будет достаточно:

SELECT REFERENCE, X.VALUE AS UUID
FROM TABLENAME, LATERAL FLATTEN(TABLENAME.UUID) X
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...