aws-sdk-ruby - 将 AWS S3 Select 与适用于 Ruby 的 AWS 开发工具包结合使用时出现编码错误

标签 aws-sdk-ruby amazon-s3-select

我正在尝试执行以下操作:

  • 从 S3 下载 Athena 查询的输出 (file.csv)
  • gzip 输出并上传到不同的 S3 位置 (file.csv.gz)
  • 使用 Ruby SDK 中的 S3 Select 查询 file.csv.gz 的内容

我总是收到以下错误,总是“near byte 8192”,即使 file.csv.gz 的内容完全不同:

Aws::S3::Errors::InvalidTextEncoding(需要 UTF-8 编码。在字节 8,192 附近发现文本编码错误。)

注意:对相同的未压缩的 file.csv 使用相同的 S3 Select 查询可以按预期工作。我尝试过各种奇怪的事情,但却充满了绝望。

重现步骤:

  1. 从文件 s3://mybucket/file.csv 开始
  2. 使用 aws-cli 下载:aws s3 cp s3://mybucket/file.csv file.csv
  3. Gzip 文件:gzip file.csv
  4. 上传file.csv.gz:aws s3 cp file.csv.gz s3://mybucket/file.csv.gz

代码如下:

class RunsS3SelectQueries
  def self.client
    @client ||= Aws::S3::Client.new
  end

  def self.run_query(sql:, bucket:, key:)
    data = ""
    handler = Aws::S3::EventStreams::SelectObjectContentEventStream.new
    handler.on_records_event do |event|
      puts "----records payload:----"
      payload = event.payload.read
      data += payload
    end
    handler.on_stats_event do |event|
       # get :stats event that contains progress information
       puts event.details.inspect
       # => Aws::S3::Types::Stats bytes_scanned=xx, bytes_processed=xx, bytes_returned=xx
    end
    params = {
      bucket: bucket,
      key: key,
      expression_type: "SQL",
      expression: sql,
      input_serialization: {
        csv: { file_header_info: "USE"}
      },
      output_serialization: {
        csv: {}
      },
      event_stream_handler: handler,
    }
    client.select_object_content(params)
    data
  end
end

以下收到文本编码错误。

output = RunsS3SelectQueries.run_query(sql: %q{SELECT * FROM S3Object }, bucket: 'mybucket', key: 'file.csv.gz')

但是,针对未压缩的 file.csv 运行不会:

output = RunsS3SelectQueries.run_query(sql: %q{SELECT * FROM S3Object }, bucket: 'mybucket', key: 'file.csv')

我尝试了文本编码、内容类型元数据、内容编码等的各种组合,但似乎找不到任何有效的方法。在我看来,它总是在字节 8192 上出现错误这一事实非常奇怪/可疑。

任何帮助将不胜感激!

最佳答案

您需要指定输入在 input_serialization 中进行 gzip 压缩,否则 s3 将尝试解码 gzip header ,并会收到有关其在字节 8192 处不是有效 utf-8 的错误。

像下面这样的东西会起作用:

输入序列化:{ csv: { file_header_info: "使用"} 压缩类型:“GZIP” }

关于aws-sdk-ruby - 将 AWS S3 Select 与适用于 Ruby 的 AWS 开发工具包结合使用时出现编码错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52320081/

相关文章:

ruby - 使用 Ruby 删除 DynamoDB 表中的所有项目

ruby - 如何使用 SDK 创建指向 S3(静态托管)网站终端节点的 AWS Cloudfront 分配?

ruby-on-rails - Searchkick AWS凭证到期

java - Amazon S3 选择问题 : not supporting line break occurring inside fields

amazon-web-services - AWS S3 Select 和 AWS Athena 有什么区别?

ruby-on-rails - 错误 "uninitialized constant AWS (NameError)"

ruby - 如何使用 rspec 模拟 AWS SDK (v2)?

amazon-web-services - s3-select 查询字段名数据

python - 使用二元和一元运算符、保留字且不带括号解析表达式

amazon-web-services - Amazon S3 Select 的用例