#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. Хорошо, спасибо за информацию!