创建具有不同负载字段的嵌套模式

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