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)
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而不是并行写入文件,如果超出大小限制,则只会溢出到使用多个文件.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文档中的任何地方实际记录,因此,依赖于它似乎是一个坏主意,因为它可能随时改变.