Взрыв столбца json в Афине с использованием хранимой процедуры Presto - PullRequest
0 голосов
/ 08 апреля 2020

Сценарий

Я выбрал расположение папки S3 для создания таблицы из файла CSV, который имеет 1 столбец в формате JSON. Это нужно разбить таким образом, чтобы создать много записей для одного конкретного пользователя и события.

Проблема

  1. Athena Table выглядит примерно так:
agenda_data, event_id, partner_id, record_last_updated, user_id
"{'enclosed_data': {'task_active': 'true', 'status': 'completed'}, 'Agenda-1': {'currentProgress': '', 'timelines': '30/4/2020'}, 'Agenda-2': {'currentProgress': ' ', 'timelines': '25/4/2020'}, 'Agenda-3': {'currentProgress': ' ', 'timelines': '25/4/2020'}, 'Agenda-4': {'currentProgress': ' ', 'timelines': '28/4/2020'}, 'meta': {'foo': 'bar'}, 'Summary': {'finYear': '2020'}}, 'event_id': '20200407181839', 'record_last_updated': '2020-04-07T18:24:44.557362Z','user_id': '121000'}",20200407181839,Actionable,2020-04-06T13:20:31.114397Z,121000
"{'enclosed_data': {'consolidator': {'task_active': 'true', 'status': 'completed'},'Agenda-1': {'currentProgress': '', 'timelines': '25/4/2020'},'Agenda-2': {'currentProgress': 'On Going', 'timelines': '20/4/2020'},'Agenda-3': {'currentProgress': 'Completed', 'timelines': '07/4/2020'},'Agenda-4': {'currentProgress': ' ', 'timelines': '13/4/2020'},'meta': {'foo': 'bar'}, 'Summary': {'finYear': '2020'}}, event_id': '20200407202551',record_last_updated': '2020-04-07T20:32:48.215545Z', user_id': '12354'}",20200407202551,Actionable,2020-04-07T20:32:48.215545Z,12354
Столбец agenda_data содержит данные JSON, которые необходимо разобрать. Проще говоря, я перепишу минимизированную структуру JSON.
{
  "enclosed_data": {
      "task_active": "true",
      "status": "completed"
    },
    "Agenda-1": {
      "currentProgress": "",
      "timelines": "25/4/2020"
    },
    "Agenda-2": {
      "currentProgress": "On Going",
      "timelines": "20/4/2020"
    },
    "meta": {
      "foo": "bar"
    },
    "Summary": {
      "finYear": "2020"
    }
  },
  "event_id": "20200407202551",
  "record_last_updated": "2020-04-07T20:32:48.215545Z",
  "user_id": "121000"
}
Мне нужно проецировать данные повесток дня только в разобранном виде, для того же я пытался разрешить несколько блогов, но нашел документы разумными, но здесь они go:
link1 : что очень мало помогает
link2 : не применяется, так как у меня здесь нет массивов
link3 : невозможно получить либо

Ожидаемый результат

Ожидаемый результат выглядит следующим образом:

event_id, partner_id, record_last_updated, user_id, agenda, currentProgress, timelines
20200407181839, Actionable, 2020-04-07T20:32:48.215545Z, 121000, Agenda-1, " ", "30/4/2020"
20200407181839, Actionable, 2020-04-07T20:32:48.215545Z, 121000, Agenda-2, " ", "25/4/2020"
20200407181839, Actionable, 2020-04-07T20:32:48.215545Z, 121000, Agenda-3, " ", "25/4/2020"
20200407181839, Actionable, 2020-04-07T20:32:48.215545Z, 121000, Agenda-4, " ", "28/4/2020"
20200407202551, Actionable, 2020-04-07T20:32:48.215545Z, 12354, Agenda-1, " ", "25/4/2020"
20200407202551, Actionable, 2020-04-07T20:32:48.215545Z, 12354, Agenda-2, "On Going", "20/4/2020"
20200407202551, Actionable, 2020-04-07T20:32:48.215545Z, 12354, Agenda-3, "Completed", "07/4/2020"
20200407202551, Actionable, 2020-04-07T20:32:48.215545Z, 12354, Agenda-4, " ", "13/4/2020"

РЕДАКТИРОВАТЬ # 1

Успех до сих пор, что Мне удалось разобрать json, используя функцию presto следующим образом:

QUERY

with meeting_data AS 
    (SELECT '{
  "enclosed_data": {
      "task_active": "true",
      "status": "completed"
    },
    "Agenda-1": {
      "currentProgress": "",
      "timelines": "25/4/2020"
    },
    "Agenda-2": {
      "currentProgress": "On Going",
      "timelines": "20/4/2020"
    },
    "meta": {
      "foo": "bar"
    },
    "Summary": {
      "finYear": "2020"
    }
  },
  "event_id": "20200407202551",
  "record_last_updated": "2020-04-07T20:32:48.215545Z",
  "user_id": "121000"
}' AS blob)
SELECT json_extract(blob,
         '$["Agenda-1"]') AS agenda1, json_extract(blob, '$.enclosed_data.status') AS m_status, json_extract(blob, '$.Summary.finYear') AS finYear
FROM meeting_data

ВЫХОД

agenda1, m_status, finYear
{"Agenda-1": {"currentProgress": "", "timelines":"25/4/2020"}},"completed", "2020-21"

ОТКРЫТЫЕ ВОПРОСЫ

  1. Я понял, что могу получить доступ к JSON, если поставить его вручную, мне нужно, чтобы его извлекали из столбца один за другим с помощью l oop, но как?
  2. После зацикливания, как мне взорваться и получить ожидаемый результат, повторяя другие значения столбца, которые не в формате JSON?
  3. Можно ли этого достичь, написав функцию / хранимую процедуру в presto?
...