Есть ли способ использовать COPY для нескольких файлов одновременно? - PullRequest
0 голосов
/ 11 июня 2018

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

s3 = boto3.client('s3',
     aws_access_key_id='[Access key id]',
     aws_secret_access_key='[Secret access key]')

filename = '[S3 file path]'
bucket_name = '[Bucket name]'

# Uploads the given file using a managed uploader, which will split up large
# files automatically and upload parts in parallel.
s3.upload_file(filename, bucket_name, filename)


#create table for data
statement = 'create table [table_name] ([table fields])'
conn = psycopg2.connect(
host='[host]',
user='[user]',
port=5439,
password='[password]',
dbname='dev')

cur = conn.cursor()

cur.execute(statement)
conn.commit()


#load data to redshift
conn_string = "dbname='dev' port='5439' user='[user]' password='[password]' 
host='[host]'"  
conn = psycopg2.connect(conn_string);
cur = conn.cursor()
cur.execute("""copy [table_name] from '[data location]'
    access_key_id '[Access key id]'
    secret_access_key '[Secret access key]'
    region 'us-east-1'
    null as 'NA'
    delimiter ','
    removequotes;""")
conn.commit()

Проблема с этим кодом заключается в том, что я думаю, что мне придется индивидуально создавать таблицу для каждоготаблицы, а затем скопировать его для каждого файла в отдельности.Есть ли способ получить данные в красное смещение, используя одну копию для нескольких файлов?Или можно одновременно запустить несколько операторов копирования?И возможно ли это сделать без создания таблицы для каждого отдельного файла?

1 Ответ

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

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

Существует два способа сделать параллельный прием внутрь:

  • Укажите common prefix в COPY FROM вместо определенного имени файла.

В этом случае COPY попытается загрузить все файлы из корзины / папки с этим префиксом

  • ИЛИ предоставит файл манифеста, содержащий имена файлов

В обоих случаях вы должны разбить исходные данные на соответствующее количество файлов примерно одинакового размера.Снова из документов :

Разделите ваши данные на файлы так, чтобы количество файлов было кратным количеству срезов в вашем кластере.Таким образом, Amazon Redshift может равномерно распределить данные по частям.Количество срезов на узел зависит от размера узла кластера.Например, каждый вычислительный узел DS1.XL имеет два слайса, а каждый вычислительный узел DS1.8XL имеет 32 слайса.

...