Создать вложенную схему с разными полями полезной нагрузки - PullRequest
0 голосов
/ 18 февраля 2019

При создании таблицы с AWS Athena нам нужно указать схему, и она может быть вложенной.

Я пытаюсь создать таблицу с именем events.Каждое событие будет иметь различную полезную нагрузку, например:

{
 "event_name": "user_created",
 "when": "2019-01-01 14:00:00Z", 
 "payload": {
    "name": "John Raynolds",
    "age" 35,
    "likeable": true
  }
}

{
 "event_name": "user_matched",
 "when": "2019-01-10 19:32:19Z", 
 "payload": {
    "matching_id": 99877,
    "matcher_id":  99883,
    "matching_type": "friendship"
  }
}

Таким образом, как вы можете видеть в предыдущей схеме json, поле payload отличается от каждого типа события.Какова лучшая практика для обработки этих случаев?Создать одну таблицу для каждого типа события?Создать все возможные столбцы полезной нагрузки для определения схемы Athena?

Спасибо

1 Ответ

0 голосов
/ 20 февраля 2019

Я думаю, что у вас есть два варианта: либо вы делаете так, как вы предлагаете, и создаете столбцы для каждого возможного столбца полезной нагрузки - это будет работать до тех пор, пока базовыми данными является JSON, но может не работать для всех типов данных (IIRC выиграло ')работать с файлами ORC, но не поверьте мне на слово).

Другая альтернатива - просто набрать payload столбец как STRING и использовать JSON-функции дляработать с ним, например:

SELECT
  JSON_EXTRACT_SCALAR(payload, '$.matching_type') AS matching_type,
  COUNT(*) AS count
FROM events
GROUP BY 1

Если полезная нагрузка содержит только скалярные значения, вы также можете использовать MAP<STRING,STRING> в качестве и использовать картографические функции для работы со значениями:

SELECT
  element_at(payload, 'matching_type') AS matching_type,
  COUNT(*) AS count
FROM events
GROUP BY 1
...