Подтвердить что ты не робот

Как скопировать файл данных 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, например разделители и кавычки, я не могу найти его в документах.

Может кто-нибудь помочь?

4b9b3361

Ответ 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 и чередующуюся сортировку с помощью первичного ключа.