在Ruby中读取S3中的gzip压缩数据

时间:2013-10-31 21:50:42

标签: ruby amazon-web-services amazon-s3

我公司的数据消息(json)存储在Amazon S3上的gzip压缩文件中。我想使用Ruby来遍历文件并进行一些分析。我开始使用'aws / s3'gem,并将每个文件作为对象获取:

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

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

3 个答案:

答案 0 :(得分:1)

您可以在此处查看S3Object的文档:http://amazon.rubyforge.org/doc/classes/AWS/S3/S3Object.html

您可以致电your_object.value来获取内容;看看你能不能走得那么远。那么它应该是解压缩gzip blob的问题。 Zlib应该能够解决这个问题。

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

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

答案 1 :(得分:1)

对我来说,以下步骤适用:

  1. 从S3客户端读取csv.gz并将其写入本地文件的步骤
  2. 使用gzipreader打开本地csv.gz文件并从中读取csv
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

答案 2 :(得分:0)

S3Object文档已更新,并且stream方法不再可用:https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html

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

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