Должен ли я CREATE TABLE каждый раз, когда я запускаю команду COPY - PullRequest
0 голосов
/ 12 июня 2018

Мне было поручено перевести базы данных MySQL в Amazon RedShift.В настоящее время я пытаюсь сделать это путем

1) преобразования таблиц в файлы CSV

2) их сохранения в S3

3) создания таблицы в красном смещении

4) использование команды COPY для передачи данных из S3 в красное смещение

Я использую Python, чтобы попытаться автоматизировать этот процесс, и использую boto3 для шифрования данных на пути к S3.

Однако, с процессом, который я сейчас имею, мне пришлось бы вручную создавать таблицу в Redshift для каждого CSV в S3.Поскольку в конечном итоге я собираюсь переместить много данных, это будет очень неэффективно.

Есть ли код, который я могу запустить, чтобы обнаружить схему и создать таблицу, не заходя и не изменяя CREATE TABLEкаждый раз, когда я хочу загрузить новые данные?

1 Ответ

0 голосов
/ 12 июня 2018

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

  1. Expore Все имена таблиц.
  2. Проход по именам таблиц.
  3. Повторите 4-8 для каждой таблицы.
  4. Экспорт схемы таблицы из MySQL
  5. Создание таблицы в Redshift
  6. Экспорт данных в TSV из MySQL
  7. PUT TSV-файл в S3
  8. Копирование данных в Redshift

Вот и все.

mysql -h localhost -u user -pPassword test --skip-column-names --execute="SHOW TABLES;" > database.tmp
echo "Start!"
/* Look over table name names */

for /F %%A in (database.tmp) do (
   echo "Exporting table Names for %%A"
   mysqldump -h localhost -u radhe -pPassword --no-data  database %%A > "%%A_tables.sql"

   psql -h redshift-hostname -d databasename -U username -f "%%A_tables.sql"

   mysql -h localhost -u user -pPassword  -e "select * from %%A" -B > %%A_data.tsv

   S3CMD put s3://yourbucket:path/%%A_data.tsv %%A_data.tsv

   psql -h redshift-hostname -d databasename -U username -c "copy %%A from 's3://yourbucket:path/%%A_data.tsv' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';"

)

PS : вышеуказанный цикл предназначен для Windows, но вы можете изменить его на Linux/Unix

...