Redshift 查询数组<varchar(128)> 返回编码值
Posted
技术标签:
【中文标题】Redshift 查询数组<varchar(128)> 返回编码值【英文标题】:Redshift query array<varchar(128)> returning encoded values 【发布时间】:2019-11-04 03:01:13 【问题描述】:我们在 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
运行的 Athena 中运行相同的查询时,它会返回包含正确数据的数组。
我应该在这里做什么?
【问题讨论】:
请提供源数据样本。 你说的编码是什么意思? 【参考方案1】:Redshift 不支持嵌套数据类型。
Redshift 频谱对嵌套数据类型有简单的支持 - 像 array
或 map
这样的集合类型必须在选择之前取消嵌套(分解)。
取消嵌套基本上是在集合所属行的所有集合项中进行CROSS JOIN
。
注意语法:... FROM TABLE a, a.collecion_column B ...
- 在经典查询中是 CROSS JOIN
的同义词。
所以您在"o"
列中看到的是来自attribution_ids
数组的项目之一。
【讨论】:
所以,我尝试读取该数据,并将其转换为 varchar,但它不能转换为正确的类型。我该怎么办? 那么,你是说在未嵌套的列中你得到一个0b8ad4fd9af12804ffaea83f4886672b
并且这个值在数组中不存在?雅典娜会给你不同的结果吗?等效查询将是 SELECT insert_id, a FROM spectrum.my_table cross join unnest(attribution_ids) as t(a)
以上是关于Redshift 查询数组<varchar(128)> 返回编码值的主要内容,如果未能解决你的问题,请参考以下文章
Redshift join 与 varchar(40) 和 23 亿行
Redshift varchar 列时间转换为 12 小时格式