Нормализованный json объект с массивами для выравнивания денормализованной таблицы с заданной структурой c - PullRequest
1 голос
/ 22 января 2020

У меня есть json объект с вложенными объектами и массивами. Я хочу нормализовать эту json и преобразовать ее в дено-денормализованную таблицу БД с предопределенной структурой, учитывающей типы данных, такие как timestamp, text, int et c. Если некоторые поля пропущены в json, мне нужно, чтобы в таблице это было NULL. Все файлы jsons хранятся в виде паркета, а затем копируются в красное с помощью команды копирования.

Вот пример упрощенной версии такого json объекта:

{
  "url": "https://zendesk.com/api/v2/tickets/154571.json",
  "id": 154571,
  "external_id": null,
  "via": {
    "channel": "email",
    "source": {
      "from": {
        "address": "xxxx@waitrapp.com",
        "name": "xxxx"
      },
      "to": {
        "name": "xxxx",
        "address": "support@xxxxx.com"
      },
      "rel": null
    }
  },
  "created_at": "2018-07-03T17:14:52Z",
  "collaborator_ids": ["x","a"],
  "tags": ["a","b"],
  "followup_ids": [1,2]
}

Вот требуемая структура после денормализации:

url,id,external_id,created_at,tags,followup_ids,via_channel,via_source_from_address,via_source_from_name
https://zendesk.com/api/v2/tickets/154571.json,154571,,2018-07-03T17:14:52Z,tag-a,1,email,xxxx@waitrapp.com,xxxx
https://zendesk.com/api/v2/tickets/154571.json,154571,,2018-07-03T17:14:52Z,tag-a,2,email,xxxx@waitrapp.com,xxxx
https://zendesk.com/api/v2/tickets/154571.json,154571,,2018-07-03T17:14:52Z,tag-b,1,email,xxxx@waitrapp.com,xxxx
https://zendesk.com/api/v2/tickets/154571.json,154571,,2018-07-03T17:14:52Z,tag-b,2,email,xxxx@waitrapp.com,xxxx

Вот таблица:

create table adhoc_temp.zendesk_tickets
        (
            url text,
            id bigint,
            external_id text,
            created_at timestamp,
            tags text,
            collaborator_ids int,
            via_channel text,
            via_source_rel text,
            via_source_from_ticket_id int,
            via_source_from_subject text,
            via_source_from_address text,
            via_source_from_name text,
            via_source_to_name text,
            via_source_to_address text
        );

В этом случае поля via_source_from_ticket_id, via_source_from_subject отсутствуют в источнике json, поэтому в таблице они должны быть NULL.

Я играл с json_normalize, но он не учитывает массивы. В любом случае, как я могу присоединить вложенные массивы к основному json объекту?

...