我可以在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
消息错误很明显,但我找不到问题的根源!
答案 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)
但是我遇到了像-[{"lts": 150},{"lts": 250},{"lts": 350}]
这样的json的挑战。
即使JSON中包含3个元素,查询也只返回第一个元素。这可能是由于@artikas列出的限制。
当然,我们可以像下面那样更改json以使其工作:-
{"lts": 150}
{"lts": 250}
{"lts": 350}
如果有人有更好的解决方案,请发表。