我正在运行 Redshift 卸载命令,但没有得到我想要的名称。命令是:
UNLOAD ('select * from foo')
TO 's3://mybucket/foo'
CREDENTIALS 'xxxxxx'
GZIP
NULL AS 'NULL'
DELIMITER as '\t'
allowoverwrite
parallel off
结果是 mybucket/foo-000.gz。我不想要 切片编号 作为文件名的结尾(如果能彻底去掉就好了),我想加一个文件扩展名 在文件名的末尾。我想看到以下任一情况:
有没有办法做到这一点(无需编写 lambda 后处理重命名脚本)?
最佳答案
TL;博士
没有。
说明:
正如 Amazon Redshift UNLOAD 中所说的文档,如果你不想把它分成几部分,你可以使用 PARALLEL FALSE
,但强烈建议启用它。即便如此,该文件将始终包含 000.[EXT]
后缀(当 [EXT]
仅在启用压缩时才存在),因为 Redshift 可以输出的文件大小有限制,如 documentation 中所述:
By default, UNLOAD writes data in parallel to multiple files, according to the number of slices in the cluster. The default option is ON or TRUE. If PARALLEL is OFF or FALSE, UNLOAD writes to one or more data files serially, sorted absolutely according to the ORDER BY clause, if one is used. The maximum size for a data file is 6.2 GB. So, for example, if you unload 13.4 GB of data, UNLOAD creates the following three files.
s3://mybucket/key000 6.2 GB s3://mybucket/key001 6.2 GB s3://mybucket/key002 1.0 GB
因此,它总是至少添加前缀
000
,因为 Redshift 首先不知道他要输出的文件大小,所以他添加了这个后缀,以防输出达到 6.2 GB 的大小。如果你问为什么使用
PARALLEL FALSE
不推荐,我会尝试从几个方面来解释:当您从 Redshift 卸载数据时,标志
PARALLEL
是 TRUE
,它将创建至少 X 个文件,当 X 是您首先选择构建 Redshift 集群的节点数时。这意味着,数据是直接从数据节点本身写入的,这要快得多,因为它是并行执行的并且跳过领导节点。当您决定关闭此标志时,所有数据将从所有数据节点收集到单个节点,即领导节点,因为它需要重新组织要输出的行的排序,并在需要时将其压缩为单个流。此操作会导致您的数据写入速度慢得多。
查询
COPY
和 UNLOAD
直接使用数据节点,因此,它们的行为方式与您使用 PARALLEL TRUE
的方式几乎相同。 .相反,查询如 SELECT
, UPDATE
, DELETE
和 INSERT
, 由领导节点处理,这就是为什么它们会受到领导节点负载的影响。 关于amazon-web-services - Redshift卸载的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39255954/