如何将RedShift上的表卸载到单个CSV文件?

cip*_*hor 19 mysql amazon-web-services amazon-redshift

我想将一个表从Amazon RedShift迁移到MySQL,但是使用"unload"将生成多个数据文件,这些文件难以直接导入MySQL.

有没有办法将表卸载到一个CSV文件,以便我可以直接导入MySQL?

Dan*_*SFT 38

为了发送到单个文件使用并行关闭

unload ('select * from venue')
to 's3://mybucket/tickit/unload/venue_' credentials 
'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>'
parallel off;
Run Code Online (Sandbox Code Playgroud)

另外,我建议使用Gzip,使文件更小,以便下载.

unload ('select * from venue')
to 's3://mybucket/tickit/unload/venue_' credentials 
'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>'
parallel off
gzip;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这仅适用于给定的大小.根据https://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html,2.2GB是最大文件大小,因此如果你卸载大于此的东西,你仍然会得到多个文件,即使" PARALLEL OFF"设置. (8认同)

Bre*_*ode 10

这是一个老问题,但我觉得所有现有的答案都有些误导.如果您的问题是"我绝对100%保证Redshift将始终卸载到S3中的SINGLE文件吗?",答案就是NO.

话虽如此,在大多数情况下,您通常可以限制查询,以便最终得到一个文件.根据文档(https://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html),限制生成的文件数量的主要因素是导出的实际原始大小(以字节为单位)(NOT行数).Redshift UNLOAD命令生成的输出文件大小限制为6.2GB.

因此,如果您想尝试保证从中获得单个输出文件UNLOAD,请执行以下操作:

  • 指定PARALLEL OFF.默认情况下,Parallel是"ON",除非你有一个很小的集群,否则它通常会写入多个文件(设置"PARALLEL ON"的输出文件数与集群中的片数成正比). PARALLEL OFF将串行写入S3而不是并行写入文件,如果超出大小限制,则只会溢出到使用多个文件.
  • 限制输出的大小.如果您需要单个文件,则数据的原始大小必须小于6.2GB.因此,您需要使查询具有更严格的WHERE条款或使用LIMIT子句来保持记录数量.不幸的是,这些技术都不是完美的,因为行可以是可变大小的.我也不清楚该GZIP选项是否影响输出文件大小溢出限制(不清楚6.2GB是否是GZIP之前的大小限制或后GZIP大小限制).

对我来说,在大多数情况下最终生成单个CSV文件的UNLOAD命令是:

UNLOAD
('SELECT <fields> FROM <table> WHERE <restrict_query>')
TO 's3://<bucket_name>/<filename_prefix>'
CREDENTIALS 'aws_access_key_id=<access_key>;aws_secret_access_key=<secret_key>'
DELIMITER AS ','
ADDQUOTES
NULL AS ''
PARALLEL OFF;
Run Code Online (Sandbox Code Playgroud)

另一个好的副作用PARALLEL OFF是它会尊重你的ORDER BY子句,如果你有一个并按顺序生成文件,保持所有记录的顺序,甚至跨多个输出文件.

附录:似乎有一些关于使用LIMIT 2147483647强制领导节点进行所有处理并生成单个输出文件的民俗知识,但这似乎并未在Redshift文档中的任何地方实际记录,因此,依赖于它似乎是一个坏主意,因为它可能随时改变.