我正在尝试将一些MySQL表迁移到Amazon Redshift,但遇到了一些问题。
步骤很简单: 1.将MySQL表转储到csv文件 2.将csv文件上载到S3 3.将数据文件复制到RedShift
第3步发生错误:
SQL命令是:
复制's3://ciphor/TABLE_A.csv'CREENENALALS中的TABLE_A 'aws_access_key_id = xxxx; aws_secret_access_key = xxxx'分隔符','csv;
错误信息:
执行SQL命令时发生错误:复制TABLE_A 's3://ciphor/TABLE_A.csv'KREDENTIALS 'aws_access_key_id = xxxx; aws_secret_access_key = xxxx错误:COPY CSV是 不支持[SQL State = 0A000]执行时间:0.53s 1个语句 失败。
我不知道csv文件的格式是否有任何限制,比如分隔符和引号,我在文档中找不到它。
任何人都可以提供帮助吗?
答案 0 :(得分:15)
使用以下方法最终解决问题:
复制's3://ciphor/TABLE_A.csv'CREENENALALS中的TABLE_A 'aws_access_key_id = xxxx; aws_secret_access_key = xxxx'分隔符',' removequotes;
可在此处找到更多信息http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html
答案 1 :(得分:9)
现在,Amazon Redshift支持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';
使用REMOVEQUOTES不支持在封闭字段中包含新行或分隔符的旧方法(DELIMITER和REMOVEQUOTES)存在一些缺点。如果数据可以包含此类字符,则应使用CSV选项。
有关详细信息,请参阅以下链接。
答案 2 :(得分:1)
如果您想保存自己的一些代码/您有一个非常基本的用例,您可以使用Amazon Data Pipeline。 它统计了一个现场实例并在亚马逊网络中执行转换,它是非常直观的工具(但非常简单,所以你不能用它做复杂的事情)
答案 3 :(得分:0)
你可以试试这个
复制来自&s 39://ciphor/TABLE_A.csv'的TABLE_A; CREDENTIALS' 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]
答案 4 :(得分:0)
看起来您正在尝试将本地文件加载到REDSHIFT表中。 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命令将数据附加到Redshift表。
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)
答案 5 :(得分:0)
由于已经提供了解决方案,我不会重复这一点。
但是,如果您收到一些您无法弄清楚的错误,只需在连接到任何Redshift帐户时在您的工作台上执行:
select * from stl_load_errors [where ...];
stl_load_errors以历史方式包含所有Amazon RS加载错误,普通用户可以查看与他/她自己的帐户相对应的详细信息,但超级用户可以拥有所有访问权限。
详细记录了详细信息: Amazon STL Load Errors Documentation
答案 6 :(得分:0)
发表评论的时间不多,但它很有用: -
您可以使用开源项目将表直接从mysql复制到redshift - sqlshift。
它只需要火花,如果你有纱线,那么它也可以使用。
好处: - 它会使用主键自动决定 distkey 和 interleaved sortkey 。
答案 7 :(得分:0)
我总是这个代码:
COPY clinical_survey
FROM 's3://milad-test/clinical_survey.csv'
iam_role 'arn:aws:iam::123456789123:role/miladS3xxx'
CSV
IGNOREHEADER 1
;
说明:
1- 在 S3 中复制文件存储的名称
2- FROM 文件地址
3- iam_role 是 CREDENTIAL 的替代品。请注意,应该在控制台的 iam 管理菜单中定义 iam_role,然后在 trust 菜单中也应该将其分配给用户(这是最难的部分!)
4- CSV 使用逗号分隔符
5- IGNORHEADER 1 是必须的!否则会抛出错误。 (跳过我的 CSV 的一行并将其视为标题)