如何将csv数据文件复制到Amazon RedShift?

时间:2013-03-07 02:02:08

标签: mysql csv amazon-redshift

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

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

8 个答案:

答案 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选项。

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

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

答案 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中,我执行以下操作:

  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命令将数据附加到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 的一行并将其视为标题)