Запрос динамических полей JSON для первого ненулевого значения в AWS Athena - PullRequest
2 голосов
/ 22 мая 2019

Я храню данные о событиях в S3 и хочу использовать Athena для запроса данных. Одним из полей является динамическое поле JSON, для которого я не знаю имен полей. Поэтому мне нужно запросить ключи в JSON, а затем использовать эти ключи для запроса первого ненулевого значения для этого поля. Ниже приведен пример данных, хранящихся в S3.

{
 timestamp: 1558475434,
 request_id: "83e21b28-7c12-11e9-8f9e-2a86e4085a59",
 user_id: "example_user_id_1",
 traits: {
  this: "is",
  dynamic: "json",
  as: ["defined","by","the", "client"]
 }
}

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

Самое близкое, что я мог получить, это выборка значения с использованием min_by, но это не позволяет мне добавить предложение where без возврата нулевых значений. Мне нужно будет использовать опцию presto "first_value", но я не могу заставить ее работать с извлеченными ключами JSON из динамического поля JSON.

SELECT DISTINCT trait, min_by(json_extract(traits, concat('$.', cast(trait AS varchar))), received_at) AS value
FROM TABLE
CROSS JOIN UNNEST(regexp_extract_all(traits,'"([^"]+)"\s*:\s*("[^"]+"|[^,{}]+)', 1)) AS t(trait)
WHERE json_extract(traits, concat('$.', cast(trait AS varchar))) IS NOT NULL OR json_size(traits, concat('$.', cast(trait AS varchar))) <> 0
GROUP BY  trait
...