Redshift массив запросоввозвращение закодированных значений - PullRequest
1 голос
/ 04 ноября 2019

У нас есть внешняя таблица, созданная в 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, возвращает массив с правильными данными.

Что мне здесь делать?

1 Ответ

0 голосов
/ 05 ноября 2019

Redshift не поддерживает вложенные типы данных.

Спектр Redshift имеет простую поддержку для вложенных типов данных - типы сбора, такие как array или map, должны быть не вложены (разнесены) перед выбором.

Unnesting в основном делает вид CROSS JOIN всех элементов коллекции со строкой, к которой принадлежит коллекция.

Обратите внимание на синтаксис: ... FROM TABLE a, a.collecion_column B ... - в классических запросах это синоним CROSS JOIN.

То, что вы видите в столбце "o", является одним из элементов из массива attribution_ids.

...