0

BigQuery でテーブルを作成しようとしています。単一のデータセットがあり、API を使用してテーブルを追加し、クラウド ストレージからデータ (json.tar.gz) をインポートする必要があります。プロセス全体を自動化するには、Ruby クライアントを使用できる必要があります。2 つの質問があります。

  1. 私はドキュメントを読み、それをアップロードしようとしましたが (以下のコード)、成功しておらず、何が間違っているのかまったくわかりません。誰かが私を啓発したり、正しい方向に向けてくれませんか?

  2. リクエストを行ったら、ジョブが実際にいつ終了したかをどのように知ることができますか? APIから、私はjobs.getリクエストを使用するつもりだったと思いますか? 最初の部分を完了していないので、この側面を見ることができませんでした。

これは以下の私のコードです。

config= {
  'configuration'=> {
      'load'=> {
        'sourceUris'=> ["gs://person-bucket/person_json.tar.gz"],
        'schema'=> {
          'fields'=> [
            { 'name'=>'person_id', 'type'=>'integer' },
            { 'name'=> 'person_name', 'type'=>'string' },
            { 'name'=> 'logged_in_at', 'type'=>'timestamp' },
          ]
        },
        'destinationTable'=> {
          'projectId'=> "XXXXXXXXX",
          'datasetId'=> "personDataset",
          'tableId'=> "person"
        },
        'createDisposition' => 'CREATE_IF_NEEDED',
        'maxBadRecords'=> 10,
      }
    },
    'jobReference'=>{'projectId'=>XXXXXXXXX}
  }

multipart_boundary="xxx"
body = "--#{multipart_boundary}\n"
body += "Content-Type: application/json; charset=UTF-8\n\n"
body += "#{config.to_json}\n"
body += "--#{multipart_boundary}\n"
body +="Content-Type: application/octet-stream\n\n"
body += "--#{multipart_boundary}--\n"

param_hash = {:api_method=> bigquery.jobs.insert }
param_hash[:parameters] = {'projectId' => 'XXXXXXXX'}
param_hash[:body] = body
param_hash[:headers] = {'Content-Type' => "multipart/related; boundary=#{multipart_boundary}"}

result = @client.execute(param_hash)
puts JSON.parse(result.response.header)

次のエラーが表示されます: {"error"=>{"errors"=>[{"domain"=>"global", "reason"=>"wrongUrlForUpload", "message"=>"Uploads must be sent to the URL をアップロードします。このリクエストをhttps://www.googleapis.com/upload/bigquery/v2/projects/XXXXXXXX/jobsに再送信してください"}], "code"=>400, "message"=>"Uploads must beアップロード URL に送信されました。このリクエストをhttps://www.googleapis.com/upload/bigquery/v2/projects/XXXXXXXX/jobsに再送信してください"}}

リクエスト ヘッダーから、エラーが送信先であると言っているのと同じ URI に送信されているように見えます。どんな助けでも大歓迎です。

ありがとう、素晴らしい一日を!

4

2 に答える 2

0
  1. これは「メディアのアップロード」リクエストであるため、リクエストを行うためのプロトコルが少し異なります。Ruby のドキュメントhttp://rubydoc.info/github/google/google-api-ruby-client/file/README.md#Media_Uploadで詳しく説明しています。単純なので、マルチパートではなく再開可能なアップロードを使用します。

  2. はい、ご想像のとおり、いつ完了したかを知る方法は、実行中のジョブのステータスを調べるために jobs.get() を実行することです。ジョブ ID は、jobs.insert() からの応答で返されます。さらに制御が必要な場合は、独自のジョブ ID を渡すことができます。これにより、jobs.insert() 呼び出しがエラーを返した場合に、ジョブが実際に開始されたかどうかを確認できます。

于 2013-11-14T15:52:47.603 に答える
0

有難うございます。答えは解決しました。こちらをご覧ください: クラウド ストレージ上のファイルから Bigquery に json をインポートする方法

再開可能なアップロード セクションのドキュメントのコード行 ( http://rubydoc.info/github/google/google-api-ruby-client/file/README.md#Media_Upload ) は、次のように読む必要があると思います。

result = client.execute(:api_method => drive.files.insert,

それ以外の場合、この行は「結果」が未定義のエラーをスローします。

upload = result.resumable_upload
于 2013-11-14T23:37:06.163 に答える