我公司的数据消息(json)存储在Amazon S3上的gzip压缩文件中。我想使用Ruby来遍历文件并进行一些分析。我开始使用'aws / s3'gem,并将每个文件作为对象获取:
#<AWS::S3::S3Object:0x4xxx4760 '/my.company.archive/data/msg/20131030093336.json.gz'>
但是一旦我有了这个对象,我就不知道如何解压缩它甚至访问它里面的数据。
答案 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)
对我来说,以下步骤适用:
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