红移频谱表无法识别数组



我在json S3文件上运行了一个爬网程序,用于更新现有的外部表。完成后,我检查了SVL_S3LOG以查看外部表的结构,并看到它已更新,并且我有一个新的列,其中Array<int>类型如预期。当我试图在外部表上执行select*时,我得到了这样的错误:";无效操作:嵌套表不支持SELECT子句中的"*"因此,我尝试用所有列名详细说明select语句:选择姓名、日期、书籍。。。。(books是Array<int>类型(来自external_table_a1并得到此错误:无效操作:列";书籍";在external_table_a1中不存在"我还检查了";AWS Glue";表external_table_a1;书籍";被识别并且具有类型Array<int>。有人能解释为什么我的简单查询是错误的吗?我错过了什么?

Redshift查询JSON数据有点麻烦:当启用解析(例如使用适当的SerDe配置(时,JSON将存储为SUPER类型。在您的情况下,这就是Array<int>

AWS关于查询半结构化数据的文档似乎非常简单,提到PartiQL使用";当访问嵌套数据时用于路径导航的点符号和数组下标";。这对我来说不起作用,尽管我在他们的SUPER限制文档中找不到任何原因。

解决方案1

我要做的是设置标志set json_serialization_enable to true;set json_serialization_parse_nested_strings to true;,它们将把SUPER类型解析为JSON(即返回JSON(。然后我可以使用JSON函数来查询数据。由于在SUPER类型上只能使用最不需要的语法select item from table as t, t.items as item,因此不需要的数据会变得更加疯狂。我真的不认为这是所谓的查询和unnest SUPER对象的方法,但这是唯一对我有效的方法

他们描述说,在一些较老的";AmazonRedshift开发者指南";。

解决方案2

当您编写查询或创建查询时,Redshift将尝试将输出适应一种基本列数据类型。如果查询结果与这些类型中的任何一个都不匹配,Redshift将不会处理该查询。因此,为了将SUPER转换为兼容的类型,您必须unest它(使用相当特殊的Redshift unest语法(。

对我来说,这在某些情况下有效,但我并不总是能够正确地索引数组,也不能访问数组索引(使用my_table.array_column as array_entry at array_index语法(。

最新更新