2

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

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

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

4

3 回答 3

1

您可以在此处查看文档:http S3Object: //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
于 2013-10-31T21:58:18.023 回答
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

于 2020-03-27T09:15:07.253 回答
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
于 2020-02-20T10:30:34.527 回答