0

我正在使用以下卸载命令 -

unload ('select * from '')to  's3://**summary.csv**'
CREDENTIALS 'aws_access_key_id='';aws_secret_access_key=''' parallel off allowoverwrite CSV HEADER;

在 S3 中创建的文件是summary.csv000

如果我从下面的命令中更改并删除文件扩展名

unload ('select * from '')to  's3://**summary**'
CREDENTIALS 'aws_access_key_id='';aws_secret_access_key=''' parallel off allowoverwrite CSV HEADER;

在 S3 中创建的文件是summary000

有没有办法得到summary.csv,所以我不必在导入到 excel 之前更改文件扩展名?

谢谢。

4

1 回答 1

2

实际上很多人都问过类似的问题,现在不可能为文件添加扩展名。(但parquet文件可以有)

这背后的原因是,RedShift 默认并行导出它,这是一件好事。每个切片都将导出其数据。同样来自文档,

平行

默认情况下,UNLOAD 根据集群中的 slice 数量将数据并行写入多个文件。默认选项为 ON 或 TRUE。如果 PARALLEL 为 OFF 或 FALSE,则 UNLOAD 将连续写入一个或多个数据文件,如果使用了一个,则绝对根据 ORDER BY 子句进行排序。数据文件的最大大小为 6.2 GB。因此,例如,如果您卸载 13.4 GB 的数据,UNLOAD 会创建以下三个文件。

所以它必须在6GB之后创建新文件,这就是他们添加数字作为后缀的原因。

我们如何解决这个问题?

RedShift 没有原生选项,但我们可以用 lambda 做一些变通方法。

  1. 专门为此过程创建一个新的 S3 存储桶和其中的文件夹。(例如s3://unloadbucket/redshift-files/:)
  2. 您的卸载文件应转到此文件夹。
  3. Lambda 函数应基于 S3 put 对象事件触发。
  4. 然后是 lambda 函数,
    1. 下载文件(如果文件很大,请使用 EFS)
    2. 重命名为.csv
    3. 上传到同一个桶(或不同的桶)到不同的路径(例如s3://unloadbucket/csvfiles/:)

如果您使用 shell/powershell 脚本执行以下过程,甚至更简单

  1. 下载文件
  2. 重命名为.csv
于 2020-11-18T08:37:16.113 回答