aws athena - 通过 json 对象数组创建 table

aws athena - Create table by an array of json object

我能否获得有关在 AWS Athena 上创建 table 的帮助。 对于数据示例:

[{"lts": 150}]

AWS Glue 将架构生成为:

 array (array<struct<lts:int>>)

当我尝试使用 AWS Glue 创建的 table 预览 table 时,我遇到了这个错误:

HIVE_BAD_DATA: Error parsing field value for field 0: org.openx.data.jsonserde.json.JSONObject cannot be cast to org.openx.data.jsonserde.json.JSONArray

消息错误很明确,但是找不到问题的根源!

您应该创建一个 JSON 分类器以将数组转换为对象列表而不是单个数组对象。在分类器中使用 JSON 路径 $[*],然后设置爬虫以使用它:

  • 编辑抓取工具
  • 展开'Description and classifiers'
  • 单击左侧窗格中的 'Add' 将您的分类器与抓取工具相关联

之后删除之前创建的 table 并重新 运行 爬虫。它将创建一个具有适当方案的 table 但我认为当您尝试查询它时 Athena 仍然会抱怨。但是,现在您可以使用 Glue ETL 作业读取 table 并处理单个记录对象而不是数组对象

AWS Athena 下的 Hive 运行 使用 Hive-JSON-Serde 到 serialize/deserialize JSON。出于某种原因,他们不支持任何标准 JSON。他们要求每行一条记录,没有数组。用他们的话说:

下面的示例将起作用。

{ "key" : 10 }
{ "key" : 20 }

但这不会:

{
  "key" : 20,
}

也不是这个:

[{"key" : 20}]

这个 json - [{"lts": 150}] 可以像以下查询一样工作:-

select n.lts from table_name
cross join UNNEST(table_name.array) as t (n) 

输出如下:-

但是我遇到了 json 的挑战,比如 - [{"lts": 150},{"lts": 250},{"lts": 350}]。 即使 JSON 中有 3 个元素,查询也只返回第一个元素。这可能是因为@artikas 列出的限制。 当然,我们可以像下面这样更改 json 以使其工作:-

{"lts": 150}
{"lts": 250}
{"lts": 350}

如果有人有更好的解决方案,请post。