amazon-web-services - 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 论坛上发帖。
但也许我可以使用其他一些命令或连接变量,涉及第二个分区键的文字值之类的黑客攻击,或者完全不同的策略?
解决方案
您可以添加一个人工列q
来标记查询,然后将其用作第二个分区 - 这将有效地q=queryA
为您的路径添加一个前缀。
但是,除非您提供选项,否则红移不允许UNLOAD
进入非空位置。ALLOWOVERWRITE
然后,由于您不控制卸载的文件名(它们将取决于切片计数和最大文件大小),如果您碰巧具有相同的分区键,则允许覆盖可能会导致您的数据真正被覆盖。
要解决这个问题,您可以再添加一个人工分区列,该列将向您的路径添加一个唯一组件(每次卸载的值相同)。我RANDOM
在我的例子中使用了 - 你可以使用更安全的东西。
下面是一个示例查询,即使多次卸载,它也会卸载数据而不覆盖结果。我为不同part
的q
值运行它。
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
推荐阅读
- python - 为 word2vec 实现处理语料库
- c - 如何将变量从批处理文件发送到 C 程序?
- c# - 如何从异步任务将 ItemsSource 添加到 DataGrid
- c# - 我真的需要使用 Intent 来调用活动吗?
- python-3.x - 使用 python 请求和会话进行授权
- flutter - 如何使用主题小部件使用字体设置?
- java - 如何更改 Firebase 中的数据并检查 id 自动增量
- functional-programming - 如何直接将 val 绑定到 SML 中的选项值?
- xamarin.forms - 更新 ListView 的 ObservableCollection 中一项的显示
- google-sheets - 使用 HLOOKUP 根据 2 个条件查找值