gpt4 book ai didi

mysql - 在 AWS Athena 中查询第一个非空值的动态 JSON 字段

转载 作者:行者123 更新时间:2023-12-04 13:41:40 25 4
gpt4 key购买 nike

我将事件数据存储在 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 key 一起使用。
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

最佳答案

我不清楚您期望结果是什么,以及您所说的“第一个非空值”是什么意思。在您的示例中,您同时拥有字符串值和数组值,并且它们都不为空。如果您提供更多示例以及预期输出,将会很有帮助。
作为解决方案的第一步,这里有一种从 traits 中过滤掉空值的方法。 :
如果设置了traits的类型列到 map<string,string>你应该能够做这样的事情:

SELECT
request_id,
MAP_AGG(ARRAY_AGG(trait_key), ARRAY_AGG(trait_value)) AS trait
FROM (
SELECT
request_id,
trait_key,
trait_value
FROM some_table CROSS JOIN UNNEST (trait) AS t (trait_key, trait_value)
WHERE trait_value IS NOT NULL
)
但是,如果您还想过滤作为数组的值并挑选出第一个非空值,那将变得更加复杂。它可能可以通过组合强制转换为 JSON 来完成,即 filter函数,和 COALESCE .

关于mysql - 在 AWS Athena 中查询第一个非空值的动态 JSON 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56246860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com