在Ruby中从S3读取Gzip数据
我的公司将数据消息(json)存储在AmazonS3上的gzip文件中。我想使用Ruby对文件进行迭代并进行一些分析。我开始使用“aws/s3”gem,并将每个文件作为一个对象:在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的文档: 您可以通
#<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