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

aws athena-通过json对象数组创建表,json,amazon-web-services,amazon-athena,aws-glue,Json,Amazon Web Services,Amazon Athena,Aws Glue,我可以在AWS Athena上创建表时获得帮助吗。 有关数据的示例: [{"lts": 150}] AWS将按以下方式生成架构: array (array<struct<lts:int>>) 消息错误很明显,但我找不到问题的根源 您应该创建一个JSON分类器,将数组转换为对象列表,而不是单个数组对象。在分类器中使用JSON路径$[*],然后设置爬虫程序以使用它: 编辑爬虫 展开“描述和分类器” 单击左窗格上的“添加”将您的分类器与爬虫关联 之后,删除以前创建的表

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

[{"lts": 150}]
AWS将按以下方式生成架构:

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

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

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

  • 编辑爬虫
  • 展开“描述和分类器”
  • 单击左窗格上的“添加”将您的分类器与爬虫关联

之后,删除以前创建的表并重新运行爬虫程序。它将创建一个具有适当方案的表,但我认为当您尝试查询它时,雅典娜仍然会抱怨。不过,现在您可以使用Glue ETL作业从该表中读取数据,并处理单个记录对象,而不是数组对象。运行在AWS Athena下的Hive正在使用它来序列化/反序列化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}

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

为什么要写
arrat(array)
?你不是说嵌套数组吧?它是由AWS Glue crawler(json)生成的!如果您不想将对象放在单个文件或单独的行中,这是正确的。我发现我必须在创建自定义分类器后创建一个新的爬虫程序,否则Glue将继续作为数组进行分类。我想这只是另一个胶水虫。这里有更多的文档:我也发现了这种情况。这个AWS推荐的分类器会导致Athena查询中断,这似乎很奇怪。
{"lts": 150}
{"lts": 250}
{"lts": 350}