Я храню данные о событиях в 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