首页 > 解决方案 > Redshift:可以在对 S3 进行分区卸载时为路径指定后缀吗?

问题描述

在对 S3 进行分区卸载时,有什么方法可以为路径提供后缀?

例如,如果我想将 +several+ 查询的输出用于批处理作业,其中查询输出按日期分区。

目前我在 S3 中有一个结构,如:

s3://bucket/path/queryA/key=1/ *.parquet
s3://bucket/path/queryA/key=2/ *.parquet
s3://bucket/path/queryB/key=1/ *.parquet
s3://bucket/path/queryB/key=2/ *.parquet

但理想情况下,我想拥有:

s3://bucket/path/key=1/queryA/ *.parquet
s3://bucket/path/key=2/queryA/ *.parquet
s3://bucket/path/key=1/queryB/ *.parquet
s3://bucket/path/key=2/queryB/ *.parquet

这样我就可以将其用作批处理作业的输入路径(例如在 Sagemaker 上!):

s3://bucket/path/key=1/
s3://bucket/path/key=2/

这样每个批处理作业都具有批处理作业正在计算的特定日期的所有查询的输出。

目前,我在卸载后重新调整 S3 中的数据,但如果我可以为 Redshift 指定一个后缀以附加到 S3 卸载路径,+after+ 分区后缀,它会更快、更方便。

从 UNLOAD 文档中,我假设这是不可能的,并且我无法在 AWS 论坛上发帖。

但也许我可以使用其他一些命令或连接变量,涉及第二个分区键的文字值之类的黑客攻击,或者完全不同的策略?

标签: amazon-web-servicesamazon-s3amazon-redshift

解决方案


您可以添加一个人工q来标记查询,然后将其用作第二个分区 - 这将有效地q=queryA为您的路径添加一个前缀。

但是,除非您提供选项,否则红移不允许UNLOAD进入非空位置。ALLOWOVERWRITE

然后,由于您不控制卸载的文件名(它们将取决于切片计数和最大文件大小),如果您碰巧具有相同的分区键,则允许覆盖可能会导致您的数据真正被覆盖。

要解决这个问题,您可以再添加一个人工分区列,该列将向您的路径添加一个唯一组件(每次卸载的值相同)。我RANDOM在我的例子中使用了 - 你可以使用更安全的东西。

下面是一个示例查询,即使多次卸载,它也会卸载数据而不覆盖结果。我为不同partq值运行它。

unload ($$

    WITH
    rand(rand) as (select md5(random())),
    input(val, part) as (
        select 1, 'p1' union all
        select 1, 'p2'
    )
    SELECT
        val,
        part,
        'queryB' as q,
        rand as r
    FROM input, rand

    $$)
TO 's3://XXX/partitioned_unload/'
IAM_ROLE 'XXX'
PARTITION by (part, q, r)
ALLOWOVERWRITE

这些是 3 次运行产生的文件:

aws s3 ls s3://XXX/partitioned_unload/ --recursive
2020-06-29 08:29:14          2 partitioned_unload/part=p1/q=queryA/r=b43e3ff9b6b271387e2ca5424c310bb5/0001_part_00
2020-06-29 08:28:58          2 partitioned_unload/part=p1/q=queryA/r=cfcd208495d565ef66e7dff9f98764da/0001_part_00
2020-06-29 08:29:54          2 partitioned_unload/part=p1/q=queryB/r=24a4976a535a584dabdf8861548772d4/0001_part_00
2020-06-29 08:29:54          2 partitioned_unload/part=p2/q=queryB/r=24a4976a535a584dabdf8861548772d4/0001_part_00
2020-06-29 08:29:14          2 partitioned_unload/part=p3/q=queryA/r=b43e3ff9b6b271387e2ca5424c310bb5/0002_part_00
2020-06-29 08:28:58          2 partitioned_unload/part=p3/q=queryA/r=cfcd208495d565ef66e7dff9f98764da/0001_part_00

推荐阅读