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&lt;varchar&gt; 字段时:

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 频谱对嵌套数据类型有简单的支持 - 像 arraymap 这样的集合类型必须在选择之前取消嵌套(分解)。

取消嵌套基本上是在集合所属行的所有集合项中进行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 小时格式

Redshift 的月数保留队列计算问题

Redshift dateadd() 函数错误白色将时间值从 varchar 转换为 time

Redshift 插入多行

如何运行存储在 Redshift 表中的 SQL 查询