2013-03-07 164 views
12

我正试图将一些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文件的格式是否有任何限制,比如分隔符和引号,我在文档中找不到它。

任何人都可以提供帮助吗?

+0

您将需要引用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

+1

谢谢,问题解决后,添加“removequote”选项 – ciphor 2013-03-07 04:54:52

+0

@ciphor请发布这个答案,而不是评论。 – Sundar 2013-03-12 07:00:51

回答

12

问题最终通过解析:

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

+0

您可以接受您自己的答案,将此问题标记为已回答。 – 2013-03-19 17:33:26

+0

您可以检查stl_load_errors表以查找有关模糊错误消息的更多特定信息。 ''select * from stl_load_errors;'' – koonse 2013-04-15 22:31:09

+0

它应该是'removequotes',而不是removequote .. – 2013-06-19 12:45:32

0

如果你想保存你的自我一些代码/你有一个非常基本的使用情况,你可以使用亚马逊数据管道。 它统计现货实例,并执行亚马逊网络内的转型,这真的直观的工具(但很简单,所以你不能做复杂的事情吧)

+0

据我所知,数据管道不支持红移呢。 – ciphor 2013-08-11 12:55:58

+0

我已经看过数据管道线了,对不起我是坏人。 – asafm 2013-08-12 13:06:46

+0

@ciphor [本文](http://aws.amazon.com/articles/1143507459230804)使它看起来像它(或我错过了什么?) – 2013-09-27 04:14:39

9

现在亚马逊红移支持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选项。

有关详细信息,请参阅以下链接。

http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html

+0

如果您面对**分界符未找到。**错误,则此答案是可行的解决方案。 – CLOUGH 2018-01-10 12:15:13

0

它看起来像你想的本地文件加载到红移表。 CSV文件必须在S3的COPY命令的工作。

如果你可以提取表到CSV数据文件,你又多了一个脚本选项。您可以使用Python/boto/psycopg2组合将您的CSV加载脚本编写到Amazon Redshift。

在我MySQL_To_Redshift_Loader我做了以下内容:

  1. 从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) 
    ... 
    
  2. 使用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) 
    
  3. 使用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) 
    
0

由于该决议已经提供了,我就不再重复了明显。

但是,如果你收到一些错误,当你连接到任何红移帐户您无法弄清楚,只要在您的工作台上执行:

select * from stl_load_errors [where ...]; 

stl_load_errors包含所有亚马逊RS加载历史的方式错误,其中普通用户可以查看详细信息,相当于他/她自己的帐户,但超级用户可以拥有所有的接入。

细节的精心捕捉: Amazon STL Load Errors Documentation

0

有点晚发表评论,但它可能是有用的: -

您可以使用一个开源项目,可以直接从MySQL复制表到红移 - sqlshift

它只需要火花,如果你有丝那么它也可以使用。

优点: - 它会自动决定使用主键distkey交错sortkey