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

Mysql 如何将csv数据文件复制到Amazon RedShift?,mysql,csv,amazon-redshift,Mysql,Csv,Amazon Redshift,我试图将一些MySQL表迁移到AmazonRedshift,但遇到了一些问题 步骤很简单: 1.将MySQL表转储到csv文件 2.将csv文件上载到S3 3.将数据文件复制到红移 错误发生在步骤3中: SQL命令是: 从“s3://ciphor/TABLE_A.csv”凭据复制表_A 'aws\u访问\u密钥\u id=xxxx;aws_secret_access_key=xxxx'分隔符','csv 错误信息: 执行SQL命令时出错:从中复制表 “s3://ciphor/TABLE_A.cs

我试图将一些MySQL表迁移到AmazonRedshift,但遇到了一些问题

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

错误发生在步骤3中:

SQL命令是:

从“s3://ciphor/TABLE_A.csv”凭据复制表_A 'aws\u访问\u密钥\u id=xxxx;aws_secret_access_key=xxxx'分隔符','csv

错误信息:

执行SQL命令时出错:从中复制表 “s3://ciphor/TABLE_A.csv”凭证 'aws\u访问\u密钥\u id=xxxx;aws\u secret\u access\u key=xxxx错误:复制CSV为 不支持[SQL State=0A000]执行时间:0.53s 1条语句 失败了

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


任何人都可以提供帮助?

问题最终通过以下方法解决:

从“s3://ciphor/TABLE_A.csv”凭据复制表_A 'aws\u访问\u密钥\u id=xxxx;aws_secret_access_key=xxxx'分隔符',' 删除引用


更多信息可以在这里找到

如果您想保存自己的一些代码/您有一个非常基本的用例,您可以使用Amazon数据管道。
它统计一个spot实例并在amazon网络中执行转换,这是一个非常直观的工具(但非常简单,因此您无法使用它执行复杂的操作)

现在amazon Redshift支持复制命令的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和分隔符选项导入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)有一些缺点,REMOVEQUOTES不支持在封闭的字段中包含新行或分隔符。如果数据可以包含此类字符,则应使用CSV选项

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

你可以试试这个

从's3://ciphor/TABLE_A.csv'凭证'aws_access_key_id=xxxx;aws_secret_access_key=xxxx'csv

CSV本身表示逗号分隔的值,不需要提供分隔符。请参阅链接


[

看起来您正试图将本地文件加载到红移表中。 CSV文件必须在S3上,复制命令才能工作

若您可以将数据从表中提取到CSV文件,那个么您还有一个脚本选项。您可以使用Python/boto/psycopg2组合将CSV加载脚本化到Amazon Redshift

在我的工作中,我做了以下几点:

  • 将数据从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以历史方式包含Amazon的所有load errors,普通用户可以查看与其自己帐户对应的详细信息,但超级用户可以拥有所有访问权限

    详细信息可在以下网址获取:

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

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

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

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

    我始终使用以下代码:

    COPY clinical_survey
    FROM 's3://milad-test/clinical_survey.csv' 
    iam_role 'arn:aws:iam::123456789123:role/miladS3xxx'
    CSV
    IGNOREHEADER 1
    ;
    
    说明
    1-在S3中复制文件存储的名称
    2-来自文件的地址
    3-iam_角色是凭证的替代。请注意,iam_角色应在控制台的iam管理菜单中定义,然后在信任菜单中也应分配给用户(这是最难的部分!)
    4-CSV使用逗号分隔符

    5 -无知头1是必须的!否则它会抛出一个错误。(跳过我的CSV的一行并考虑它是一个头)

    你会想引用RealStHeaveDeaveDebug文档和章节。不幸的是,乍一看,你看起来很好。谢谢,这个问题在添加了“ReaveQuo报价”之后得到了解决。" option@ciphor请将此作为回答而不是评论。您可以查看stl_加载_错误表以查找有关模糊错误消息的更多具体信息。
    “从stl_加载_错误中选择*”
    据我所知,数据管道还不支持红移。我已经查看了数据管道,您是对的,对不起,我的错误。@ciphor使它看起来像红移一样(或者我遗漏了什么?)@PaulBellora:有趣的是…它使用数据管道调用shell脚本来将数据从S3同步到红移,因此,本质上,数据管道被用作任务调度程序。如果您面临未找到分隔符的问题。错误,这个答案是可行的解决方案。