Redshift:在执行 PARTITIONED UNLOAD 到 S3 时可以指定路径后缀吗?

2024-02-19

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

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

目前我在 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 卸载路径(+在+分区后缀之后),那么会更快、更方便。

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

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


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

BUT,红移不允许UNLOAD进入非空位置,除非您提供ALLOWOVERWRITE option.

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

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

下面是一个示例查询,即使多次卸载,它也会卸载数据而不会覆盖结果。我以不同的方式运行它part and q values.

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redshift:在执行 PARTITIONED UNLOAD 到 S3 时可以指定路径后缀吗? 的相关文章

随机推荐