Redshift unload的文件名

Tod*_*odd 6 amazon-web-services amazon-redshift

我正在运行Redshift卸载命令,但我没有得到我想要的名字.命令是:

UNLOAD ('select * from foo')
                 TO 's3://mybucket/foo'
                 CREDENTIALS 'xxxxxx'
                 GZIP
                 NULL AS 'NULL'
                 DELIMITER as '\t'
                 allowoverwrite
                 parallel off
Run Code Online (Sandbox Code Playgroud)

结果是mybucket/foo-000.gz.我不希望切片编号是文件名的末尾(如果可以完全删除它会很棒),我想在文件名末尾添加文件扩展名.我想看到以下任何一种情况:

  • mybucket /富-000.txt.gz
  • mybucket/foo.txt.gz

有没有办法做到这一点(没有编写lambda post process renamer脚本)?

Sla*_*ser 13

TL; DR
No.

说明:
正如在Amazon Redshift UNLOAD文档中所述,如果您不希望将其拆分为多个部分,则可以使用PARALLEL FALSE,但强烈建议将其保留为启用状态.即使这样,文件也将始终包含000.[EXT]后缀([EXT]只有在启用压缩时才存在),因为Redshift可以输出的文件大小有限,如文档中所述:

默认情况下,UNLOAD根据群集中的切片数将数据并行写入多个文件.默认选项为ON或TRUE.如果PARALLEL为OFF或FALSE,则UNLOAD按顺序写入一个或多个数据文件,根据ORDER BY子句绝对排序(如果使用).数据文件的最大大小为6.2 GB.因此,例如,如果卸载13.4 GB的数据,UNLOAD将创建以下三个文件.

s3://mybucket/key000    6.2 GB 
s3://mybucket/key001    6.2 GB
s3://mybucket/key002    1.0 GB
Run Code Online (Sandbox Code Playgroud)

因此,它000总是至少添加前缀,因为Redshift首先不知道他将输出的文件大小,所以他添加了这个后缀,以防输出达到6.2 GB的大小.

如果你问为什么PARALLEL FALSE不推荐使用,我会尝试在几个方面解释它:

  1. 最重要的原因是Redshift集群的设计方式.每个群集包括至少2个服务器,其中一个是领导节点,其余是数据节点.领导节点的目的是控制数据节点,它保存必要的信息以处理Redshift中的所有数据,无论是读取还是写入.
    当标志PARALLEL位于Redshift时卸载数据时TRUE,它将创建至少X个文件,当X是您选择构建Redshift集群的节点数时,首先.这意味着,数据直接从数据节点本身写入,这要快得多,因为它并行执行并跳过领导节点.
    当您决定将此标志设置为关闭时,所有数据都将从所有数据节点收集到单个节点(领导节点),因为它需要重新组织行的排序以进行输出,并在需要时将其压缩为单个节点流.此操作会导致数据写入速度变慢.
  2. 此外,这在读取和写入数据方面显着降低了Redshift集群性能,因为所有内容(读取和写入查询)都通过领导节点,如上所述,当领导节点过载时,将会有性能问题.
    因此,查询COPYUNLOAD数据节点直接工作,它们的行为方式与您使用的方式几乎相同PARALLEL TRUE.在此相反,查询一样SELECT,UPDATE,DELETEINSERT,由领导节点进行处理,这就是为什么他们从领导节点负载受到影响.

  • 即使明确提供扩展名,我也看不出为什么文件不能生成为“s3://mybucket/key.csv000”,而不能是“s3://mybucket/key000.csv” (2认同)