首页 > 解决方案 > S3 文件大小为十进制时的频谱表清单文件

问题描述

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

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

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

  1. 当我在清单文件中提供文件大小为 102604.8 时,出现错误“文件条目没有设置内容长度”
  2. 当我为下一个整数 102605 提供舍入值时,我收到错误“频谱错误”
  3. 当我为前一个整数 102604 提供一个舍入值时,我再次收到相同的错误“频谱错误”

我的清单看起来像:

{

  "entries": [

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

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

  ]

}

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

标签: amazon-s3amazon-redshiftmanifestamazon-redshift-spectrum

解决方案


文件的实际大小是多少?

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

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

您可以通过将文件复制到本地计算机并调用来检查文件的大小

stat -f%z my_file.csv

您也可以直接检查 s3 对象的元数据,例如。aws cli

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

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

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


推荐阅读