你可以添加一个人造的 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