aws athena - 由json对象数组创建表

时间:2018-05-17 23:06:51

标签: json amazon-web-services amazon-athena aws-glue

我可以在AWS Athena上创建表格时获得帮助吗? 有关数据的示例示例:

[{"lts": 150}]

AWS Glue生成架构:

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

以下示例将起作用。

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

但是这不是:

{
  "key" : 20,
}

也不是这样:

[{"key" : 20}]

答案 1 :(得分:1)

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

  • 编辑抓取工具
  • 展开“说明和分类器”
  • 点击左侧窗格中的“添加”,将分类器与抓取工具相关联

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

答案 2 :(得分:0)

此json-[{"lts": 150}]可以像下面的查询一样使用:-

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

输出如下:- enter image description here

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

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

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