Spectrum table S3 文件大小为十进制时的清单文件

Spectrum table Manifest file when S3 file size is in decimal

我正在通过创建外部 Spectrum table 并将其指向包含源 S3 文件信息的清单文件来读取 S3 文件。 问题是当我的 S3 文件大小为十进制时,例如37.5 MB 或 100.2 KB。

根据文档,我们需要以字节为单位提供文件大小。现在,当我使用 1000 的乘数转换为字节时,我丢失了外部 table 中文件末尾的一些记录或一些数据。 但是当我使用 1024 的乘数转换为字节时,我转换后的文件大小将以十进制表示。

考虑到我的文件大小为 100.2 KB,因此以字节为单位为 102604.8 字节。

  1. 当我在清单文件中提供文件大小为 102604.8 时,我得到一个 错误 "File entry does not have content length set"
  2. 当我为下一个整数 102605 提供舍入值时,出现错误 "Spectrum Error"
  3. 当我为前一个整数 102604 提供舍入值时,我再次遇到相同的错误 "Spectrum Error"

我的清单看起来像:

{

  "entries": [

    {"url":"s3://path/filename1.csv", "meta": { "content_length": 102605 } },

    {"url":"s3://path/filename2.csv", "meta": { "content_length": 102605 } }

  ]

}

这里有没有人遇到过这种情况,可以分享他们的意见。

文件的实际大小是多少?

Consider I have a file size 100.2 KB, so in bytes it would be 102604.8 Bytes.

100.2 KB 的值不是准确的文件大小(以字节为单位)。您的文件将始终具有完整的字节数(因为数据以字节为单位存储在内存中)。

您可以通过将文件复制到本地计算机并调用

来检查文件的大小
stat -f%z my_file.csv

你也可以直接检查s3对象的元数据,例如。 AWS 客户端

aws s3api head-object --bucket my_bucket --key my_objects_key --query 'ContentLength' 

在我们的系统中,我们使用后者(但使用 boto3 python 库)到 assemble 清单文件,它可以正常工作。

对于调试,您还可以查看一些内部 Redshift 表,例如 STL_ERROR or SVL_S3LOG