在Ruby中从S3读取Gzip数据

在Ruby中从S3读取Gzip数据,ruby,amazon-web-services,amazon-s3,Ruby,Amazon Web Services,Amazon S3,我的公司将数据消息(json)存储在AmazonS3上的gzip文件中。我想使用Ruby对文件进行迭代并进行一些分析。我开始使用“aws/s3”gem,并将每个文件作为一个对象: #<AWS::S3::S3Object:0x4xxx4760 '/my.company.archive/data/msg/20131030093336.json.gz'> # 但是一旦我有了这个对象,我就不知道如何解压它,甚至不知道如何访问其中的数据 您可以在此处查看S3Object的文档: 您可以通

我的公司将数据消息(json)存储在AmazonS3上的gzip文件中。我想使用Ruby对文件进行迭代并进行一些分析。我开始使用“aws/s3”gem,并将每个文件作为一个对象:

#<AWS::S3::S3Object:0x4xxx4760 '/my.company.archive/data/msg/20131030093336.json.gz'> 
#

但是一旦我有了这个对象,我就不知道如何解压它,甚至不知道如何访问其中的数据

您可以在此处查看
S3Object
的文档:

您可以通过调用
your_object.value
获取内容;看看你能不能走那么远。那么应该是一个打开gzip blob的问题
Zlib
应该能够处理这个问题

我不确定
.value
是否返回一大串二进制数据或IO对象。如果它是一个字符串,您可以将其包装在
StringIO
对象中,以将其传递给
Zlib::gzip阅读器

json_data = Zlib::GzipReader.new(StringIO.new(your_object.value)).read  
S3Object
有一个
stream
方法,我希望它的行为像IO对象一样(对不起,我不能在这里测试)。如果是这样,您可以这样做:

json_data = Zlib::GzipReader.new(your_object.stream).read 
一旦你有了解压后的json内容,你就可以在上面调用
json.parse
,例如

JSON.parse Zlib::GzipReader.new(StringIO.new(your_object.value)).read

S3Object
文档已更新,
stream
方法不再可用:

因此,从S3对象读取数据的最佳方法是:

json_data = Zlib::GzipReader.new(StringIO.new(your_object.read)).read

对我来说,以下一系列步骤奏效了:

  • 将csv.gz从S3客户端读写到本地文件的步骤
  • 使用gzipreader打开本地csv.gz文件并从中读取csv
  • file_path=“/tmp/gz/x.csv.gz”
    打开(文件路径,mode=“wb”)do | f|
    s3_client.get_对象(bucket:bucket,key:key)do | gzfiledata|
    f、 写入文件数据
    结束
    结束
    数据=[]
    Zlib::gzip读取器.open(文件路径)do | gz|u读取器|
    csv_阅读器=::FastestCSV.new(gz_阅读器)
    csv|U reader.each do|csv|
    
    数据感谢@struthersneil很多好的建议让我继续前进。
    file_path = "/tmp/gz/x.csv.gz"
    File.open(file_path, mode="wb") do |f|
      s3_client.get_object(bucket: bucket, key: key) do |gzfiledata|
      f.write gzfiledata
     end
    end
    
    data = []
    Zlib::GzipReader.open(file_path) do |gz_reader|
     csv_reader = ::FastestCSV.new(gz_reader)
     csv_reader.each do |csv|
      data << csv
     end
    end