AWS Spectrum查询报Unexpected end of compressed file错误如何解决?
问题原因及解决方案
核心问题
你遇到的报错是因为JSON清单文件中填写的content_length值和S3上test.gz文件的实际字节大小不匹配导致的。
- 执行带
limit的查询时,Redshift Spectrum仅需要读取文件开头的部分数据即可返回指定行数的结果,不需要遍历完整文件,因此不会触发全文件的解压校验,所以能正常运行。 - 执行
count(*)这类需要扫描全表的查询时,Spectrum会严格按照你在清单中声明的content_length读取对应长度的字节,如果你填写的数值大于文件实际大小,就会读到不存在的内容,触发Unexpected end of compressed file报错;如果填写的数值小于实际大小,会导致数据读取不全。
解决方案
你可以二选一处理:
- 直接删除JSON清单中
meta下的content_length字段,该字段为可选配置,删除后Spectrum会自动从S3对象元数据中获取文件的真实大小,无需手动声明。修改后的JSON清单示例如下:
{ "entries": [ {"url":"s3://s3_bucket/SpectrumTest/test.gz"} ] }
- 如果你需要保留
content_length配置,就到S3控制台查看test.gz对象的实际字节大小,将content_length的值替换为和实际大小完全一致的数值即可。
额外说明
你直接引用S3文件夹时查询正常,就是因为这种场景下Spectrum会自动拉取每个文件的真实大小元数据,不存在手动填错数值的问题。
内容的提问来源于stack exchange,提问作者Itay
相关产品推荐
相关产品推荐

