创建具有不同负载字段的嵌套模式
Create nested schema with different payload fields
使用 AWS Athena 创建 table 时,我们需要指定一个架构,它可以嵌套。
我正在尝试创建一个名为 events
的 table。
每个事件都有不同的负载,如下所示:
{
"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
与每种类型的事件不同。
处理这些情况的最佳做法是什么?为每个事件类型创建一个 table?为 Athena 架构定义创建所有可能的负载列?
谢谢
我认为您有两个选择:要么按照您的建议为每个可能的负载列创建列——只要基础数据是 JSON,这就可以工作,但可能不适用于所有数据类型(IIRC 它不适用于 ORC 文件,但不要相信我的话)。
另一种方法是简单地将 payload
列键入 STRING
并使用 JSON functions 来处理它,例如:
SELECT
JSON_EXTRACT_SCALAR(payload, '$.matching_type') AS matching_type,
COUNT(*) AS count
FROM events
GROUP BY 1
如果负载仅包含标量值,您还可以使用 MAP<STRING,STRING>
作为并使用 map functions 来处理这些值:
SELECT
element_at(payload, 'matching_type') AS matching_type,
COUNT(*) AS count
FROM events
GROUP BY 1
使用 AWS Athena 创建 table 时,我们需要指定一个架构,它可以嵌套。
我正在尝试创建一个名为 events
的 table。
每个事件都有不同的负载,如下所示:
{
"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
与每种类型的事件不同。
处理这些情况的最佳做法是什么?为每个事件类型创建一个 table?为 Athena 架构定义创建所有可能的负载列?
谢谢
我认为您有两个选择:要么按照您的建议为每个可能的负载列创建列——只要基础数据是 JSON,这就可以工作,但可能不适用于所有数据类型(IIRC 它不适用于 ORC 文件,但不要相信我的话)。
另一种方法是简单地将 payload
列键入 STRING
并使用 JSON functions 来处理它,例如:
SELECT
JSON_EXTRACT_SCALAR(payload, '$.matching_type') AS matching_type,
COUNT(*) AS count
FROM events
GROUP BY 1
如果负载仅包含标量值,您还可以使用 MAP<STRING,STRING>
作为并使用 map functions 来处理这些值:
SELECT
element_at(payload, 'matching_type') AS matching_type,
COUNT(*) AS count
FROM events
GROUP BY 1