18

我正在尝试将一些 MySQL 表迁移到 Amazon Redshift,但遇到了一些问题。

步骤很简单: 1. 将 MySQL 表转储到 csv 文件 2. 将 csv 文件上传到 S3 3. 将数据文件复制到 RedShift

第 3 步出现错误:

SQL 命令是:

从 's3://ciphor/TABLE_A.csv' 复制 TABLE_A CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' delimiter ',' csv;

错误信息:

执行 SQL 命令时出错: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 个语句失败。

我不知道 csv 文件的格式是否有任何限制,比如分隔符和引号,我在文档中找不到它。

任何人都可以帮忙吗?

4

8 回答 8

16

问题最终通过使用解决:

从 's3://ciphor/TABLE_A.csv' 复制 TABLE_A 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-13T04:10:08.777 回答
11

现在 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';

使用旧方法(DELIMITER 和 REMOVEQUOTES)有一些缺点,REMOVEQUOTES 不支持在封闭的文件中包含换行符或分隔符。如果数据可以包含此类字符,则应使用 CSV 选项。

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

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

于 2013-11-19T20:12:49.310 回答
1

如果您想为自己保存一些代码/您有一个非常基本的用例,您可以使用 Amazon Data Pipeline。它统计一个现场实例并在亚马逊网络中执行转换,它是非常直观的工具(但非常简单,所以你不能用它做复杂的事情)

于 2013-08-11T12:21:51.210 回答
1

你可以试试这个

从 's3://ciphor/TABLE_A.csv' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' csv 复制 TABLE_A;

CSV 本身表示逗号分隔值,无需为此提供分隔符。请参考链接。

[ http://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-format.html#copy-format]

于 2016-07-22T12:33:28.240 回答
1

我总是这个代码:

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_role 应在控制台的 iam 管理菜单中定义,然后在 trust 菜单中也应分配给用户(这是最难的部分!)
4- CSV 使用逗号分隔符
5- IGNORHEADER 1 是必须的!否则会抛出错误。(跳过我的 CSV 的一行并将其视为标题)

于 2021-04-01T16:19:15.483 回答
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)
    
于 2016-12-23T15:34:25.520 回答
0

由于已经提供了解决方案,我将不再重复显而易见的事情。

但是,如果您收到更多无法解决的错误,只需在连接到任何 Redshift 帐户时在工作台上执行:

select * from stl_load_errors [where ...];

stl_load_errors 以历史方式包含所有 Amazon RS 加载错误,普通用户可以查看与他/她自己的帐户对应的详细信息,但超级用户可以拥有所有访问权限。

详细信息请参阅: Amazon STL 加载错误文档

于 2016-12-24T10:55:34.950 回答
0

评论有点晚了,但它可能很有用:-

您可以使用开源项目将表直接从 mysql 复制到 redshift- sqlshift

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

优点:- 它将使用主键自动决定distkey交错排序键。

于 2017-01-11T08:37:33.993 回答