如何将csv数据文件复制到Amazon RedShift?
我正试图将一些MySQL表迁移到Amazon Redshift,但遇到了一些问题。如何将csv数据文件复制到Amazon RedShift?
步骤很简单: 1.转储MySQL表到csv文件 2.上传csv文件到S3 3.复制数据文件到红移在步骤3中出现
错误:
的SQL命令是:
copy TABLE_A from 's3://ciphor/TABLE_A.csv' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' delimiter ',' csv;
错误信息:
An error occurred when executing the SQL command: copy TABLE_A from 's3://ciphor/TABLE_A.csv' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx ERROR: COPY CSV is not supported [SQL State=0A000] Execution time: 0.53s 1 statement(s) failed.
我不知道csv文件的格式是否有任何限制,比如分隔符和引号,我在文档中找不到它。
任何人都可以提供帮助吗?
问题最终通过解析:
copy TABLE_A from 's3://ciphor/TABLE_A.csv' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' delimiter ',' removequotes;
更多信息可以在这里找到http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html
您可以接受您自己的答案,将此问题标记为已回答。 – 2013-03-19 17:33:26
您可以检查stl_load_errors表以查找有关模糊错误消息的更多特定信息。 ''select * from stl_load_errors;'' – koonse 2013-04-15 22:31:09
它应该是'removequotes',而不是removequote .. – 2013-06-19 12:45:32
现在亚马逊红移支持COPY命令CSV选项。最好使用此选项正确导入CSV格式的数据。格式如下所示。
COPY [table-name] from 's3://[bucket-name]/[file-path or prefix]' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' CSV;
缺省的分隔符是(,),默认引号是(“)。您也可以用CSV和这样的DELIMITER选项导入TSV格式的数据。
COPY [table-name] from 's3://[bucket-name]/[file-path or prefix]' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' CSV DELIMITER '\t';
有使用旧的方式(DELIMITER和REMOVEQUOTES)时,REMOVEQUOTES不支持在封闭的字段中有新的行或分隔符字符,这是一些缺点。如果数据可以包含此类字符,则应使用CSV选项。
有关详细信息,请参阅以下链接。
如果您面对**分界符未找到。**错误,则此答案是可行的解决方案。 – CLOUGH 2018-01-10 12:15:13
你可以从这个
副本TABLE_A尝试'S3://ciphor/TABLE_A.csv的凭证 'aws_access_key_id = XXXX; aws_secret_access_key = XXXX' CSV;
CSV本身意味着逗号分隔值,不需要提供分隔符。请参阅链接。
[http://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-format.html#copy-format]
它看起来像你想的本地文件加载到红移表。 CSV文件必须在S3的COPY命令的工作。
如果你可以提取表到CSV数据文件,你又多了一个脚本选项。您可以使用Python/boto/psycopg2组合将您的CSV加载脚本编写到Amazon Redshift。
在我MySQL_To_Redshift_Loader我做了以下内容:
-
从MySQL提取数据到临时文件。
loadConf=[ db_client_dbshell ,'-u', opt.mysql_user,'-p%s' % opt.mysql_pwd,'-D',opt.mysql_db_name, '-h', opt.mysql_db_server] ... q=""" %s %s INTO OUTFILE '%s' FIELDS TERMINATED BY '%s' ENCLOSED BY '%s' LINES TERMINATED BY '\r\n'; """ % (in_qry, limit, out_file, opt.mysql_col_delim,opt.mysql_quote) p1 = Popen(['echo', q], stdout=PIPE,stderr=PIPE,env=env) p2 = Popen(loadConf, stdin=p1.stdout, stdout=PIPE,stderr=PIPE) ...
-
使用boto Python模块和分段上传将数据压缩并加载到S3。
conn = boto.connect_s3(AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY) bucket = conn.get_bucket(bucket_name) k = Key(bucket) k.key = s3_key_name k.set_contents_from_file(file_handle, cb=progress, num_cb=20, reduced_redundancy=use_rr)
-
使用psycopg2 COPY命令将数据添加红移表。
sql=""" copy %s from '%s' CREDENTIALS 'aws_access_key_id=%s;aws_secret_access_key=%s' DELIMITER '%s' FORMAT CSV %s %s %s %s;""" % (opt.to_table, fn, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,opt.delim,quote,gzip, timeformat, ignoreheader)
由于该决议已经提供了,我就不再重复了明显。
但是,如果你收到一些错误,当你连接到任何红移帐户您无法弄清楚,只要在您的工作台上执行:
select * from stl_load_errors [where ...];
stl_load_errors包含所有亚马逊RS加载历史的方式错误,其中普通用户可以查看详细信息,相当于他/她自己的帐户,但超级用户可以拥有所有的接入。
细节的精心捕捉: Amazon STL Load Errors Documentation
有点晚发表评论,但它可能是有用的: -
您可以使用一个开源项目,可以直接从MySQL复制表到红移 - sqlshift。
它只需要火花,如果你有丝那么它也可以使用。
优点: - 它会自动决定使用主键distkey和交错sortkey。
您将需要引用Redshift开发者文档的[“从Amazon S3加载数据”](http://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-S3.html)和['COPY'语法](http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html)部分。不幸的是,你第一眼看起来很好看...... – Charles 2013-03-07 02:52:18
谢谢,问题解决后,添加“removequote”选项 – ciphor 2013-03-07 04:54:52
@ciphor请发布这个答案,而不是评论。 – Sundar 2013-03-12 07:00:51