2

私の会社では、Amazon S3 の gzip ファイルにデータ メッセージ (json) を保存しています。Ruby を使用してファイルを繰り返し処理し、分析を行いたいと考えています。「aws/s3」ジェムの使用を開始し、各ファイルをオブジェクトとして取得します。

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

しかし、このオブジェクトを取得すると、それを解凍する方法や、その中のデータにアクセスする方法さえわかりません。

4

3 に答える 3

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.parse解凍されたjsonコンテンツを取得したら、それを呼び出すことができます。

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 に答える