Как скопировать файл данных csv в Amazon RedShift?
Я пытаюсь перенести некоторые таблицы MySQL в Amazon Redshift, но столкнулся с некоторыми проблемами.
Шаги просты:
1. Дамп таблицы MySQL в файл csv
2. Загрузите файл csv на S3
3. Скопируйте файл данных в RedShift
Ошибка на этапе 3:
Команда SQL:
скопировать TABLE_A из 's3://ciphor/TABLE_A.csv' ПОЛНОМОЧИЯ 'aws_access_key_id = xxxx; aws_secret_access_key = xxxx' delimiter ',' csv;
Информация об ошибке:
При выполнении команды SQL произошла ошибка: скопируйте TABLE_A из 's3://ciphor/TABLE_A.csv' ПОЛНОМОЧИЯ 'aws_access_key_id = xxxx; aws_secret_access_key = xxxx ОШИБКА: КОПИРОВАНИЕ CSV не поддерживается [SQL State = 0A000] Время выполнения: 0.53s 1 инструкция не удалось.
Я не знаю, есть ли какие-либо ограничения в формате файла csv, например разделители и кавычки, я не могу найти его в документах.
Может кто-нибудь помочь?
Ответы
Ответ 1
Проблема окончательно решена с помощью:
скопировать TABLE_A из 's3://ciphor/TABLE_A.csv' ПОЛНОМОЧИЯ 'aws_access_key_id = xxxx; aws_secret_access_key = xxxx' delimiter ',' removequotes;
Более подробную информацию можно найти здесь http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html
Ответ 2
Теперь Amazon Redshift поддерживает функцию CSV для команды COPY. Лучше использовать эту опцию для правильного импорта данных в формате CSV. Формат показан ниже.
COPY [table-name] from 's3://[bucket-name]/[file-path or prefix]' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' CSV;
По умолчанию разделителем является (,), а кавычки по умолчанию - ("). Также вы можете импортировать данные в формате TSV с параметрами CSV и DELIMITER, как это.
COPY [table-name] from 's3://[bucket-name]/[file-path or prefix]' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' CSV DELIMITER '\t';
Есть несколько недостатков в использовании старого способа (DELIMITER и REMOVEQUOTES), который REMOVEQUOTES не поддерживает наличие новой строки или символа разделителя в закрытой папке. Если данные могут содержать такие символы, вы должны использовать CSV-опцию.
Подробнее см. следующую ссылку.
http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html
Ответ 3
Если вы хотите сохранить себе код или у вас есть очень простой вариант использования, вы можете использовать Amazon Data Pipeline.
он ставит экземпляр пятна и выполняет преобразование в сети amazon, и это действительно интуитивно понятный инструмент (но очень простой, поэтому вы не можете делать с ним сложные вещи)
Ответ 4
Вы можете попробовать с этим
скопировать TABLE_A из 's3://ciphor/TABLE_A.csv' CREDENTIALS 'aws_access_key_id = xxxx; aws_secret_access_key = xxxx' csv;
CSV сам по себе означает значения, разделенные запятыми, и не нужно предоставлять этому разделителю. См. Ссылку.
[http://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-format.html#copy-format]
Ответ 5
Похоже, вы пытаетесь загрузить локальный файл в таблицу REDSHIFT.
CSV файл должен находиться на S3 для работы команды COPY.
Если вы можете извлечь данные из таблицы в CSV файл, у вас есть еще один сценарий. Вы можете использовать комбинацию Python/boto/psycopg2 для script нагрузки вашего CSV на Amazon Redshift.
В моем MySQL_To_Redshift_Loader Я делаю следующее:
-
Извлеките данные из MySQL в файл temp.
loadConf=[ db_client_dbshell ,'-u', opt.mysql_user,'-p%s' % opt.mysql_pwd,'-D',opt.mysql_db_name, '-h', opt.mysql_db_server]
...
q="""
%s %s
INTO OUTFILE '%s'
FIELDS TERMINATED BY '%s'
ENCLOSED BY '%s'
LINES TERMINATED BY '\r\n';
""" % (in_qry, limit, out_file, opt.mysql_col_delim,opt.mysql_quote)
p1 = Popen(['echo', q], stdout=PIPE,stderr=PIPE,env=env)
p2 = Popen(loadConf, stdin=p1.stdout, stdout=PIPE,stderr=PIPE)
...
-
Сжатие и загрузка данных на S3 с помощью модуля boto Python и многостраничной загрузки.
conn = boto.connect_s3(AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY)
bucket = conn.get_bucket(bucket_name)
k = Key(bucket)
k.key = s3_key_name
k.set_contents_from_file(file_handle, cb=progress, num_cb=20,
reduced_redundancy=use_rr )
-
Используйте команду psycopg2 COPY для добавления данных в таблицу Redshift.
sql="""
copy %s from '%s'
CREDENTIALS 'aws_access_key_id=%s;aws_secret_access_key=%s'
DELIMITER '%s'
FORMAT CSV %s
%s
%s
%s;""" % (opt.to_table, fn, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,opt.delim,quote,gzip, timeformat, ignoreheader)
Ответ 6
Поскольку разрешение уже предоставлено, я не буду повторять очевидное.
Однако, если вы получите еще одну ошибку, которую вы не можете найти, просто выполните на своем рабочем столе, когда вы подключены к любой из учетных записей Redshift:
select * from stl_load_errors [where ...];
stl_load_errors содержит все ошибки загрузки Amazon RS в историческом стиле, когда обычный пользователь может просматривать детали, соответствующие его/ее собственной учетной записи, но суперпользователь может иметь весь доступ.
Детали подробно описаны в:
Документация ошибок загрузки Amazon STL
Ответ 7
Немного поздно комментировать, но это может быть полезно: -
Вы можете использовать проект с открытым исходным кодом для копирования таблиц непосредственно из mysql в redshift - sqlshift.
Требуется только искра, и если у вас есть пряжа, тогда она также может быть использована.
Преимущества: - он автоматически решает distkey и чередующуюся сортировку с помощью первичного ключа.