Amazon web services 红移频谱:查询匿名JSON数组结构

Amazon web services 红移频谱:查询匿名JSON数组结构,amazon-web-services,amazon-redshift,aws-glue,amazon-redshift-spectrum,Amazon Web Services,Amazon Redshift,Aws Glue,Amazon Redshift Spectrum,我在S3中有一个JSON结构数组,通过Glue成功地对其进行了爬网和编目 [{"key":"value"}, {"key":"value"}] 我正在使用自定义分类器: $[*] $.values[*] 但是,当尝试从频谱查询时,它返回: 顶级Ion/JSON结构必须是匿名数组当且仅当 已设置serde属性“strip.outer.array”。文件中出现不匹配 我在Glue catalog表中手动设置了serde属性,但没有任何更改 无法通过Spectrum查询匿名数组吗?在JSON文

我在S3中有一个JSON结构数组,通过Glue成功地对其进行了爬网和编目

[{"key":"value"}, {"key":"value"}]
我正在使用自定义分类器:

$[*] 
$.values[*]
但是,当尝试从频谱查询时,它返回:

顶级Ion/JSON结构必须是匿名数组当且仅当 已设置serde属性“strip.outer.array”。文件中出现不匹配

我在Glue catalog表中手动设置了serde属性,但没有任何更改


无法通过Spectrum查询匿名数组吗?

在JSON文件中对数组进行如下命名:

"values":[{"key":"value"},...}
以及更新分类器:

$[*] 
$.values[*]
解决了这个问题。。。不过,我想知道是否有办法查询匿名数组。这样存储数据似乎很常见

更新: 最终,这个解决方案不起作用,因为Spectrum实际上永远不会返回任何结果。没有错误,只是没有结果,到目前为止,除了每行使用单个记录外,仍然没有解决方案:

{"key":"value"}
{"key":"value"}
etc.
这似乎确实是一个频谱特定的问题,因为雅典娜仍然有效


想知道是否有其他人能够让它工作…

如果您的表的结构如下所示:

CREATE EXTERNAL TABLE spectrum.testjson(struct<id:varchar(25), 
columnName<array<struct<key:varchar(20),value:varchar(20)>>>);
有关更多信息,您可以参考AWS文档:


您可以使用json_extract_path_text来提取元素,也可以使用json_extract_array_element_text('json string',pos[,null_if_invalid])

例如: 对于第二个索引元素 选择json_extract_array_element_text(“[11111 2113]”,2)


输出:113

我已经成功地完成了这项工作,但没有数据分类器。我的JSON文件如下所示:

[
    {
        "col1": "data_from_col1",
        "col2": "data_from_col2",
        "col3": [
            {
                "col4": "data_from_col4",
                ...
            {
        ]
    },
    {
        "col1": "data_from_col1",
        "col2": "data_from_col2",
        "col3": [
            {
                "col4": "data_from_col4",
                ...
            {
        ]
    },
    ...
]
我从一个爬虫开始获取一个基本的表定义。重要提示:无法将Output下爬虫程序的配置选项设置为更新表定义…,否则稍后重新运行爬虫程序将覆盖下面描述的手动更改。我只使用添加新列

我必须添加'strip.outer.array'属性,并手动添加匿名数组中最顶端的列。初始爬网程序运行的原始架构为:

anon_array array<struct<col1:string,col2:string,col3:array<struct<col4...>>>
partition_0 string

直到今天,这仍然是一个问题。除了你在回答中提到的以外,你还发现了什么吗?@HasanJ自这篇文章以来我所做的所有实现我们都选择每行使用一条记录,而不是一个[匿名]数组。。。所以我不知道是否有一个可行的解决方案。@HassanJ我想知道我的答案是否适用于你和@ComfyToday这是一个有趣的解决方案。我没有看到strip.out.array参数。模式中的前两列是什么?你能在回答中举一个JSON的例子,这样就可以清楚地知道你的文件是什么样子了吗?谢谢你的回答!我添加了一个JSON示例。我已经有了上面的模式——最初的爬虫程序想出了什么,以及我如何手动编辑它以使其与strip.outer.array参数一起工作。如果仍有不清楚的地方,请告诉我。我做了同样的事情,但仍然使用了分类器
$[*]
,它工作正常。这里的关键点是,在手动编辑表之后,确保再次运行爬虫程序。这让我可以使用红移光谱查询数据。
select o.partition_0, o.col1, o.col2, t.col4
from db.tablename o
LEFT JOIN o.col3 t on true;