有没有办法一次在多个文件上使用COPY?

时间:2018-06-11 13:08:58

标签: python postgresql amazon-web-services copy amazon-redshift

我正试图找到一种方法来移动我们的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 :(得分:3)

Redshift确实支持来自单个连接的parallelized form of COPY,事实上,它似乎是来自多个连接的同时COPY数据到同一个表的反模式。

two ways to do parallel摄取:

  • common prefix中指定COPY FROM,而不是指定特定文件名。

在这种情况下,COPY将尝试从具有该前缀的存储桶/文件夹中加载所有文件

  • OR,提供包含文件名称的清单文件

在这两种情况下,您应该将源数据分成适当数量的大小相等的文件。再次来自docs

  

将数据拆分为文件,以便文件数量是群集中切片数量的倍数。这样,Amazon Redshift可以在切片之间均匀地划分数据。每个节点的切片数取决于群集的节点大小。例如,每个DS1.XL计算节点都有两个切片,每个DS1.8XL计算节点有32个切片。