首页 > 解决方案 > Redshift 查询数组返回编码值

问题描述

我们在 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

Redshiftinsert_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]

当我们在 Athena 中运行相同的查询时,SELECT * FROM my_table它会返回包含正确数据的数组。

我应该在这里做什么?

标签: databaseamazon-redshiftdata-warehouseamazon-redshift-spectrum

解决方案


Redshift 不支持嵌套数据类型。

Redshift 频谱对嵌套数据类型具有简单的支持 - 集合类型,例如arraymap必须在选择之前取消嵌套(分解)。

取消嵌套基本上是对CROSS JOIN集合所属行的所有集合项中的一种。

注意语法:... FROM TABLE a, a.collecion_column B ...- 在经典查询中是CROSS JOIN.

因此,您在"o"列中看到的是数组中的一项attribution_ids


推荐阅读