[英]Is it possible to create flat table from nested json object in AWS Athena?
[英]aws athena - Create table by an array of json object
我可以在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
消息错误很明显,但是我找不到问题的根源!
在AWS Athena下运行的Hive正在使用Hive-JSON-Serde来序列化/反序列化JSON。 由于某些原因,它们不只支持任何标准JSON。 他们要求每行一条记录,没有数组。 用他们的话说:
以下示例将起作用。
{ "key" : 10 }
{ "key" : 20 }
但这不会:
{
"key" : 20,
}
也没有:
[{"key" : 20}]
您应该创建一个JSON分类器,将数组转换为对象列表,而不是单个数组对象。 在分类器中使用JSON路径$[*]
,然后设置搜寻器以使用它:
之后,删除先前创建的表并重新运行搜寻器。 它将创建一个具有适当方案的表,但是我认为当您尝试查询该表时,Athena仍会抱怨。 但是,现在您可以使用Glue ETL作业从该表中读取并处理单个记录对象而不是数组对象
这个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}
如果有人有更好的解决方案,请发表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.