使用不同的有效负载字段创建嵌套模式

时间:2019-02-18 12:49:16

标签: sql amazon-athena

使用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模式定义创建所有可能的有效负载列?

谢谢

1 个答案:

答案 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