代码问题
我们在Redshift中创建了一个外部表,如下所示:
CREATE EXTERNAL TABLE spectrum.my_table(
insert_id varchar(128),attribution_ids array<varchar(100)>
PARTITIONED BY (
event_date varchar(128))
STORED AS ParqUET
LOCATION
's3://my_bucket/my_path'
我们所做的一切都很完美,但是当我们查询文档描述的array<varchar>
字段时:
SELECT c.insert_id,a FROM
spectrum.my_table c,c.attribution_ids a LIMIT 10
Redshift正确返回insert_id
,但返回的数组编码如下:
"insert_id","o"
"0baed794-df11-4032-b13c-aac5d0deced7" "0b8ad4fd9af12804ffaea83f4886672b"
源数据应为:
"0baed794-df11-4032-b13c-aac5d0deced7",[0baed794-df11-4032-b13c-aac5d0deced7,0baed794-df11-4032-b13c-aac5d0deced7]
当我们在雅典娜中以SELECT * FROM my_table
运行相同的查询时,它将返回具有正确数据的数组。
我在这里应该做什么?
问题答案
Redshift不支持嵌套数据类型。
Redshift频谱对嵌套数据类型具有简单的支持-选择之前,array
或map
之类的集合类型必须取消嵌套(分解)。
取消嵌套基本上对集合所属行的所有集合项进行CROSS JOIN
处理。
请注意语法:... FROM TABLE a,a.collecion_column B ...
-在经典查询中,它是CROSS JOIN
的同义词。
因此,您在"o"
列中看到的是attribution_ids
数组中的一项。
如果觉得前端之家所整理的内容很不错的话,欢迎点击下方分享按钮,转发给身边开发程序员好友。