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

Posted

技术标签:

【中文标题】有没有办法一次在多个文件上使用 COPY?【英文标题】:Is there a way to use COPY on multiple files at once? 【发布时间】:2018-06-11 13:08:57 【问题描述】:

我正在尝试找到一种方法来移动我们的 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()

这个代码的问题是我认为我必须为每个表单独创建一个表,然后为每个文件单独复制它。有没有办法使用多个文件的单个副本将数据放入红移?或者是否可以一次运行多个复制语句?是否可以在不为每个文件创建表的情况下做到这一点?

【问题讨论】:

MySQL 不支持 COPY SQL 子句.. PostgreSQL 确实支持 COPY SQL 子句.. 你确定你标记了正确的数据库吗?.. 除了 psycopg2 看起来是 PostgreSQL 的 python PostgreSQL 数据库适配器。 . 我已将标签 MySQL 更改为 PostgreSQL。 我们正在使用 MySQL 数据库并将其转移到基于 PostgreSQL 的 Redshift 【参考方案1】:

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

有two ways to do parallel摄取:

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

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

或者,提供一个清单文件,其中包含文件的名称

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

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

【讨论】:

以上是关于有没有办法一次在多个文件上使用 COPY?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法一次在 Unity 3d 动画窗口中添加多个属性?

我可以一次在数组中显示影片剪辑的多个副本吗

Grafana:一次在多个面板上添加注释

一次在Firefox中运行两个快捷命令

一次在 Safari 上播放多个音频文件

使用Unix';find';一次在多个文件上设置svn Id