AWS Redshift Spectrum(внешняя таблица) — тип данных Varchar, назначенный столбцу, не может обрабатывать как массив, так и строковые данные для одного столбца

#amazon-web-services #amazon-redshift #amazon-redshift-spectrum

#amazon-web-services #amazon-redshift #amazon-redshift-spectrum

Вопрос:

Задача: Попытка загрузить кучу файлов JSON из сегментов s3 в Redshift с использованием Redshift Spectrum. Проблема: объекты JSON в нескольких файлах содержат данные, заключенные в квадратные скобки, но другие файлы JSON содержат те же объекты без квадратных скобок. Есть ли способ использовать данные как с квадратными скобками, так и без них «[ ]» при создании внешней таблицы с использованием таблицы спектра красного смещения?

Используемые ФАЙЛЫ JSON:

Файл 1: "x":{"y":{ "z":["ABCD"]}}

Файл 2: "x":{"y":{ "z":"EFGH"}}

Случай 1

Когда столбец z определяется как массив, я пропускаю данные из файла JSON, которые «без квадратных скобок»

 CREATE EXTERNAL TABLE spectrum.table
(x struct<y:struct<z:array<varchar(256)>>>)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'dots.in.keys'='true') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
location 's3://****'
  

Запрос: Select c from spectrum.table t , t.x.y.z c;

Случай 2

Когда столбец z определяется как varchar (без объявления в виде массива), ниже приведена ошибка:

Создать инструкцию:

 CREATE EXTERNAL TABLE spectrum.table
(x struct<y:struct<z:varchar(256)>>)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'dots.in.keys'='true') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
location 's3://****'
  

Запрос: Select regexp_replace( t.x.y.z ,'\([\"])', '' ) from spectrum.table t; или Select t.x.y.z from spectrum.table t ;

  [XX000][500310] [Amazon](500310) Invalid operation: Spectrum Scan Error
 Details:
-----------------------------------------------
 error:  Spectrum Scan Error
 code:      15001
 context:   Unsupported implicit cast: Column ('x' 'y' 'z'), From Type: LIST, To Type: VARCHAR, 

 ----------------------------------------------
  

Комментарии:

1. вы когда-нибудь это понимали? Столкнувшись с той же проблемой

2. Это то, что сказала служба поддержки AWS — . После тестирования многих альтернативных вариантов, к сожалению, оказывается, что невозможно определить схему внешней таблицы таким образом, чтобы она могла считывать данные json с одним из столбцов, определенных как массив или строка. Итак, я получил данные JSON, скопированные непосредственно из S3 в Redshift, и работал над столбцом, чтобы извлечь необходимую часть данных.

3. Хорошо, спасибо за информацию!