1214: неверное форматирование кавычек для CSV при импорте данных из cvs в Redshift с помощью команды COPY - PullRequest
0 голосов
/ 16 апреля 2019

Я выполняю команду COPY ниже для импорта данных из CVS в Redshift и получаю ошибку:

psql -w -U user1 -h host1 db1 --port 123 -c \
    "COPY table1 FROM 's3://bucket1/table1.csv' \  
     credentials 'aws_access_key_id=aaaaa;aws_secret_access_key=aaaa' \
     IGNOREHEADER 1 \
     csv NULL AS 'NULL' ;"

ОШИБКА: Ошибка загрузки в таблицу rainlab_translate_attributes.Подробности смотрите в системной таблице 'stl_load_errors'.

, когда я проверяю stl_load_errors, я вижу:

1214 Неверное форматирование кавычек для CSV
Кажется, \ и {} вызывающая проблема, которая присутствует в значении моего столбца.

Есть ли обходной путь для такой проблемы?

1 Ответ

0 голосов
/ 17 апреля 2019

Проблема в том, что ваши данные содержат " символов, и это значение по умолчанию для QUOTE символов в COPY ... CSV ... (см. документация ).

выглядит так, как будто ваши данные в формате JSONи он полон , и " символов, и они не заключены в кавычки и не экранированы.Я полагаю, что вам придется изменить свой CSV-файл, чтобы иметь возможность его загружать, потому что в настоящее время Redshift (и никто другой) может отличать разделитель , от , в JSON.

Как вы прочтете ниже, существует несколько вариантов структурирования вашего CSV-файла, но он сразу показывает все недостатки этого формата файлов для хранения данных - он может быть более кратким, чем, например, JSON, но приносит тонныпроблем, как только вы храните что-нибудь более сложное.После прочтения моих предложений подумайте также об изменении формата файла, напримерJSON, который имеет более четкую семантику, когда дело доходит до qouting .

Как заставить его работать с использованием CSV

Я предполагаю, что ваши CSV-данные выглядят так:

"1","app.name","{"x":"app.name","en":"dfgdggfdfdd","de":"dfdddffgf Entwicklerportal","ja":"fgdfgdfg\\\\dfgfdd\\\\fdfg\\\\gfdgf\\\\gfdgd\\\\fdgdf\\\\gfgfdg\\\\dgdfg","zh-gfdd":"gdfgdgd\\\\gfgd\\\\gfdgd\\\\fgdfdf\\\\dgfdgfd\\\\gdfgdf\\\\dgdfgfd"}"

Вариант 1 - Используйте другой символ QUOTE:

Например, используйте backtick в качестве QUOTE Измените ваши данные так:

`1`,`app.name`,`{"x":"app.name","en":"dfgdggfdfdd","de":"dfdddffgf Entwicklerportal","ja":"fgdfgdfg\\\\dfgfdd\\\\fdfg\\\\gfdgf\\\\gfdgd\\\\fdgdf\\\\gfgfdg\\\\dgdfg","zh-gfdd":"gdfgdgd\\\\gfgd\\\\gfdgd\\\\fgdfdf\\\\dgfdgfd\\\\gdfgdf\\\\dgdfgfd"}`

Вам не нужно указывать все поля, только те, которые содержат,.

И используйте эту команду COPY:

psql -w -U user1 -h host1 db1 --port 123 -c \
    "COPY table1 FROM 's3://bucket1/table1.csv' \  
     credentials 'aws_access_key_id=aaaaa;aws_secret_access_key=aaaa' \
     IGNOREHEADER 1 \
     CSV QUOTE AS '`' 
     NULL AS 'NULL' ;"

Вариант 2 - экранируйте свой QUOTE символ:

Измените свои данные так, чтобы они выглядели так:

"1","app.name","{""x"":""app.name"",""en"":""dfgdggfdfdd"",""de"":""dfdddffgf Entwicklerportal"",""ja"":""fgdfgdfg\\\\dfgfdd\\\\fdfg\\\\gfdgf\\\\gfdgd\\\\fdgdf\\\\gfgfdg\\\\dgdfg"",""zh-gfdd"":""gdfgdgd\\\\gfgd\\\\gfdgd\\\\fgdfdf\\\\dgfdgfd\\\\gdfgdf\\\\dgdfgfd""}"

Таким образом, вы ясно указываете, где заканчивается поле в кавычках.Затем вы можете использовать вашу оригинальную команду COPY.

Вариант 3 - используйте DELIMITER, которого нет в ваших данных.

Тогда вам не нужно цитировать.Используйте, например, | в качестве разделителя

Измените данные так, чтобы они выглядели следующим образом:

1|app.name|{"x":"app.name","en":"dfgdggfdfdd","de":"dfdddffgf Entwicklerportal","ja":"fgdfgdfg\\\\dfgfdd\\\\fdfg\\\\gfdgf\\\\gfdgd\\\\fdgdf\\\\gfgfdg\\\\dgdfg","zh-gfdd":"gdfgdgd\\\\gfgd\\\\gfdgd\\\\fgdfdf\\\\dgfdgfd\\\\gdfgdf\\\\dgdfgfd"}

И используйте эту команду COPY:

psql -w -U user1 -h host1 db1 --port 123 -c \
    "COPY table1 FROM 's3://bucket1/table1.csv' \  
     credentials 'aws_access_key_id=aaaaa;aws_secret_access_key=aaaa' \
     IGNOREHEADER 1 \
     CSV QUOTE AS '`' 
     DELIMITER AS '|'
     NULL AS 'NULL' ;"
...