我有一个MySQL表,我正在迁移到Redshift。步骤非常简单。
- 将 MySQL 表导出为 CSV
- 将 CSV 放入 Amazon S3 中
- 在Redshift中创建具有精确规范的表作为MySQL表
- 将 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