使用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模式定义创建所有可能的有效负载列?
谢谢
答案 0 :(得分:0)
我认为您有两种选择:要么按照您的建议进行操作,然后为每个可能的有效负载列创建列-只要基础数据是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