亚马逊网络服务 - 如何在从 S3 迁移到 Redshift DB 时删除标题行



我有一个MySQL表,我正在迁移到Redshift。步骤非常简单。

  1. 将 MySQL 表导出为 CSV
  2. 将 CSV 放入 Amazon S3 中
  3. 在Redshift中创建具有精确规范的表作为MySQL表
  4. 将 CSV 导出复制到 Redshift 中

我在最后一步遇到问题。我的MySQL CSV导出中有标头。我目前无法重新创建它,所以我被困在 CSV 文件上。 由于标题,Step 4给了我一个错误。

与其更改 CSV,我很乐意添加一行来说明标题。我已经搜索了AWS的文档来复制表,这些文档非常广泛,但没有考虑标题。寻找类似header = TRUE的内容添加到下面的查询中。

我现在在 Redshift 中的 COPY 语句如下所示:

COPY apples FROM
's3://buckets/apples.csv'  
CREDENTIALS 'aws_access_key_id=abc;aws_secret_access_key=def'
csv
;

找到了 IGNOREHEADER 函数,但仍然不知道在哪里写它。

现在很明显,但只需在底部添加 IGNOREHEADER。1 表示您要跳过标题的行数,也就是我的 CSV 有一行标题。

COPY apples FROM
's3://buckets/apples.csv'  
CREDENTIALS 'aws_access_key_id=abc;aws_secret_access_key=def'
csv
IGNOREHEADER 1
;

有一个 Copy 命令可以使用的参数。参考文档

所以你可以使用 S3ToRedshiftOperator 做这样的事情你想在copy_options下添加'IGNOREHEADER 1' : list[str]

要使用它:

copy_options_list = ["csv", "timeformat 'auto'", 'IGNOREHEADER 1']
transfer_s3_to_redshift = S3ToRedshiftOperator(
    task_id="music_story_s3_to_redshift",
    redshift_conn_id=redshift_connection_id,
    s3_bucket=s3_bucket_name,
    s3_key=s3_key,
    schema=schema_name,
    table=redshift_table,
    column_list=cols_list,
    copy_options=copy_options_list,
    dag=dag,
)

然后,复制指令变为:

COPY <schema.table> (column1, column2, column3…)
                FROM 's3://<BUCKET_NAME>/<PATH_TO_YOUR_S3_FILE>’
                credentials
                'aws_access_key_id=<> ;aws_secret_access_key=<>;token=<>’
                csv
        timeformat 'auto'
        IGNOREHEADER 1;
    , parameters: None

最新更新