Нет эквивалента FILLRECORD
для COPY от JSON. Это явно не поддерживается в документации.
Но у вас есть более фундаментальная проблема - первая запись содержит массив, кратный addresses
.Redshift COPY из JSON не позволяет вам создавать несколько строк из вложенных массивов.
Самый простой способ решить эту проблему - определить файлы для загрузки как внешнюю таблицу и использовать наш Синтаксис вложенных данных , чтобы развернуть встроенный массив в полные строки.Затем используйте INSERT INTO
для загрузки данных в итоговую таблицу.
DROP TABLE IF EXISTS spectrum.partial_json;
CREATE EXTERNAL TABLE spectrum.partial_json (
name VARCHAR(100),
addresses ARRAY<STRUCT<zip:INTEGER
,city:VARCHAR(100)
,street_address:VARCHAR(255)
,state:VARCHAR(2)>>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://my-test-files/partial_json/'
;
INSERT INTO final_table
SELECT ext.name
, address.zip
, address.city
, address.street_address
, address.state
FROM spectrum.partial_json ext
LEFT JOIN ext.addresses address ON true
;
-- name | zip | city | street_address | state
-- -------+-------+---------------+-----------------+-------
-- Sam P | 12345 | Silver Spring | 2960 Silver Ave | MD
-- Sam P | 99999 | Curry | 2960 Silver Ave | PA
-- Sam Q | | | |
-- Sam R | | | |
Примечание: я немного подправил ваш пример JSON, чтобы сделать это проще.Например, у вас были неключевые объекты в качестве значений для name
, которые я превратил в простые строковые значения.