redshift 卸载操作导致冗余数据

Posted

技术标签:

【中文标题】redshift 卸载操作导致冗余数据【英文标题】:redshift Unload operation causing redundant data 【发布时间】:2020-07-09 15:33:54 【问题描述】:

我们使用 UNLOAD 命令在基于 s3 的外部表上运行一些转换,并将数据以 PARQUET 格式发布到不同的 s3 存储桶中。

我在卸载操作中使用 ALLOWOVERWRITE 选项来替换已经存在的文件。这在大多数情况下都可以正常工作,但有时会为相同的数据插入重复文件,这会导致外部表显示重复的数字。

例如,如果分区中的 parquet 是包含完整数据的 0000_part_00.parquet。在下一次运行中,卸载预计会覆盖此文件,而是插入新文件 0000_part_01.parquet,这会使总输出加倍。

如果我只是清理整个分区并再次运行,这将不再重复。这种不一致使我们的系统变得不可靠。

unload (<simple select statement>)
to 's3://<s3 bucket>/<prefix>/'
iam_role '<iam-role>' allowoverwrite
PARQUET
PARTITION BY (partition_col1, partition_col2);

谢谢。

【问题讨论】:

你应该使用CLEANPATH而不是ALLOWOVERWRITE 【参考方案1】:

为防止出现冗余数据,您必须在 UNLOAD 语句中使用 Redshift 的 CLEANPATH 选项。请注意与 the documentation 的区别(也许 AWS 可以更清楚一点):

ALLOWOVERWRITE
By default, UNLOAD fails if it finds files that it would possibly overwrite. If ALLOWOVERWRITE is specified, UNLOAD overwrites existing files, including the manifest file.

CLEANPATH
The CLEANPATH option removes existing files located in the Amazon S3 path specified in the TO clause before unloading files to the specified location.
If you include the PARTITION BY clause, existing files are removed only from the partition folders to receive new files generated by the UNLOAD operation.
You must have the s3:DeleteObject permission on the Amazon S3 bucket. For information, see Policies and Permissions in Amazon S3 in the Amazon Simple Storage Service Console User Guide. Files that you remove by using the `CLEANPATH` option are permanently deleted and can't be recovered.
You can't specify the `CLEANPATH` option if you specify the `ALLOWOVERWRITE` option.

因此,正如@Vzzarr 所说,ALLOWOVERWRITE 只会覆盖与传入文件名同名的文件。对于不需要保持过去数据状态不变的重复卸载操作,您必须使用CLEANPATH

请注意,您不能在同一个 UNLOAD 语句中同时使用 ALLOWOVERWRITECLEANPATH

这是一个例子:

f"""
UNLOAD ('your_query')
TO 's3://destination_prefix/'
iam_role 'IAM_ROLE_ARN'
PARQUET
MAXFILESIZE 4 GB
MANIFEST verbose
CLEANPATH
"""

【讨论】:

有趣的补充CLEANPATH,他们可能已经阅读了我的评论并添加了它啊啊它现在允许几个新的用例【参考方案2】:

根据我的经验,ALLOWOVERWRITE 参数仅基于生成的文件名:因此仅当 2 个文件具有相同名称时才会覆盖结果。

这个参数在大多数情况下都有效,但在这个领域“大多数情况”还不够好。从那以后我停止使用它(我很失望)。我所做的是从 S3 控制台手动删除文件(或实际将它们移动到暂存文件夹中),然后在不依赖 ALLOWOVERWRITE 参数的情况下卸载数据。

这个答案的cmets中也提到了https://***.com/a/61594603/4725074

【讨论】:

以上是关于redshift 卸载操作导致冗余数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在架构上同步应用程序工程师 (Postgres) 和数据工程师 (Redshift)

GCP BigQuery 数据传输服务中的错误:找不到适合 jdbc:redshift:// 的驱动程序

DatagGrip 无法识别 Redshift 特定命令

Redshift 终止长时间运行的查询

尝试使用 node-redshift 从节点连接到 redshift 时超时

将 IntelliJ 连接到 Amazon Redshift