Разбор JSON в снежинку - PullRequest
       5

Разбор JSON в снежинку

0 голосов
/ 16 апреля 2020

Я пытаюсь проанализировать вложенный ниже JSON в Snowflake, используя латтеральную функцию в Snowflake, но я хотел, чтобы каждый вложенный столбец в "GoalTime" отображался в виде столбца. Например,

GoalTime_InDoorOpen         
2020-03-26T12:58:00-04:00   

GoalTime_InLastOff
null

GoalTime_OutStartBoarding
2020-03-27T14:00:00-04:00  
"GoalTime": [
    {
      "GoalName": "GoalTime_InDoorOpen",
      "GoalTime": "2020-03-26T12:58:00-04:00"
    },
    {
      "GoalName": "GoalTime_InLastOff"
    },
    {
      "GoalName": "GoalTime_InReadyToTow"
    },
    {
      "GoalName": "GoalTime_OutTowAtGate"
    },
    {
      "GoalName": "GoalTime_OutStartBoarding",
      "GoalTime": "2020-03-27T14:00:00-04:00"
    },

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

или если у вас много строк (которые кажутся рейсами), и, следовательно, вам нужно, чтобы столбцы для каждого полета соответствовали тому, что вы используете после

with data as (
select flight_code, parse_json(json) as json from values ('nz101','{GoalTime:[{"GoalName": "GoalA", "GoalTime": "2020-03-26T12:58:00-04:00"}, {"GoalName": "GoalB"}]}'),
                                                 ('nz201','{GoalTime:[{"GoalName": "GoalA"}, {"GoalName": "GoalB", "GoalTime": "2020-03-26T12:58:00-02:00"}]}') 
                                                 j(flight_code, json)
), unrolled as (
select d.flight_code, f.value:GoalName as goal_name, f.value:GoalTime as goal_time
from data d,
lateral flatten (input => json:GoalTime) f
)
select * 
from unrolled
    pivot(min(goal_time) for goal_name in ('GoalA', 'GoalB'))
order by flight_code;

, это дает результаты:

FLIGHT_CODE 'GoalA'                       'GoalB'
nz101       "2020-03-26T12:58:00-04:00"   null
nz201       null                          "2020-03-26T12:58:00-02:00"
0 голосов
/ 16 апреля 2020
create or replace function JSON_STRING()
returns string
language javascript
as
$$
return `
[
  {
        "GoalName": "GoalTime_InDoorOpen",
        "GoalTime": "2020-03-26T12:58:00-04:00"
    },
    {
        "GoalName": "GoalTime_InLastOff"
    },
    {
        "GoalName": "GoalTime_InReadyToTow"
    },
    {
        "GoalName": "GoalTime_OutTowAtGate"
    },
    {
        "GoalName": "GoalTime_OutStartBoarding",
        "GoalTime": "2020-03-27T14:00:00-04:00"
    }
]
`;
$$;

select value:GoalName::string as GoalName, value:GoalTime::timestamp as GoalTime
from lateral flatten(input => parse_json(JSON_STRING()));

-- See how the lateral flatten combination works on a JSON variant:
select * from lateral flatten(input => parse_json(JSON_STRING()));

Я написал это для запуска на любом листе Snowflake, таблицы не нужны. Функция сверху просто позволяет записать JSON в виде многострочной строки в инструкции SQL под ней. Он не имеет другого использования, кроме представления строки, содержащей ваш JSON.

. Шаг 1 - PARSE_ JSON, который преобразует строку в вариантный тип данных, отформатированный как объект JSON.

Шаг 2 - боковое выравнивание. Если вы выберете звездочку, она вернет количество столбцов. Одним из них является «значение».

Шаг 3 состоит в извлечении свойств, которые вы хотите, используя единственную нотацию: для имени свойства и точек, чтобы пройти оттуда узлы (если они есть).

Шаг 4 - приведение свойства к нужному типу данных с использованием двойной :: нотации. Это особенно важно, если вы выполняете сравнение столбца, особенно в ключах соединения.

Обратите внимание, что есть небольшая недопустимая часть JSON, которая не позволяет ему анализировать. На верхнем уровне массив имеет свойство, которое не анализируется. Я удалил это, чтобы разрешить анализ.

...