1

私は公式のGoogleRubygemを使用していますが、これまでに試したすべての機能(プロジェクト、データセット、テーブルの一覧表示、テーブルの作成など)は正常に機能していますが、JSON内で次のように読み込みジョブを開始できません。エラー応答:

"Job configuration must contain exactly one job-specific configuration object (e.g., query, load, extract, spreadsheetExtract), but there were 0: "

私が作成したボディストリングは次のようになります。

--xxx
Content-Type: application/json; charset=UTF-8
{"configuration":{"load":{"destinationTable":{"projectId":"mycompany.com:projectId","datasetId":"all_events","tableId":"install"},"createDisposition":"CREATE_NEVER","writeDisposition":"WRITE_APPEND"}}}
--xxx
Content-Type: application/octet-stream
test,second,1234,6789,83838
--xxx

以前、そのデータに適切なスキーマを使用してテーブルを作成したinstallので、それが問題になることはありません。

そして最後に、完全を期すために、リクエストを実行するために使用している実際のコードを次に示します(これらは、より大きなクラス内の2つのメソッドです)。

def create_insert_job
  config = {
    'configuration' => {
      'load' => {
        'destinationTable' => {
          'projectId' => 'mycompany.com:projectId',
          'datasetId' => 'all_events',
          'tableId' => 'install'
        },
        'createDisposition' => 'CREATE_NEVER',
        'writeDisposition' => 'WRITE_APPEND'
      }
    }
  }

  body = "#{multipart_boundary}\n"
  body += "Content-Type: application/json; charset=UTF-8\n"
  body += "#{config.to_json}\n"
  body += "#{multipart_boundary}\n"
  body +="Content-Type: application/octet-stream\n"
  body += "test,second,1234,6789,83838\n"
  body += "#{multipart_boundary}\n"

  prepare_big_query # This simply gets tokens and instantiates google_client and big_query_api
  param_hash = { api_method: big_query_api.jobs.insert }
  param_hash[:parameters] = {'projectId' =>'mycompany.com:projectId'}
  param_hash[:body] = body
  param_hash[:headers] = {'Content-Type' => "multipart/related; boundary=#{multipart_boundary}"}

  result = google_client.execute(param_hash)
  JSON.parse(result.response.body)
end

def multipart_boundary
  '--xxx'
end

何か案は?

このコードを機能させるための以下の回答への追加

上記の#multipart_boundaryメソッドは、すでに「-」が付加された状態で返されることに注意してください。これは問題です。境界ヘッダーを(パラメーターハッシュで)設定すると、本当に「xxx」が必要なときに「--xxx」になるためです。

また、このgemのドキュメントはかなりラフです。これは、改行の問題を修正した後(@jconditの回答による)、間違ったURLへのアップロードに関する新しいエラーが発生したためです。これは、次を追加する必要があるためです。

'uploadType' => 'multipart'

リクエストを適切なURLに送信するためにパラメータに追加します。

したがって、(改行と境界の問題を修正した後)機能した最終的なparam_hashは次のようになります。

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

2 に答える 2

0

各 MIME パーツのヘッダーと各 MIME パーツの本文の間に余分な改行を挿入する必要があります。リクエストの本文は次のようになります。

--xxx
Content-Type: application/json; charset=UTF-8

{"configuration":{"load":{"destinationTable":{"projectId":"mycompany.com:projectId","datasetId":"all_events","tableId":"install"},"createDisposition":"CREATE_NEVER","writeDisposition":"WRITE_APPEND"}}}
--xxx
Content-Type: application/octet-stream

test,second,1234,6789,83838
--xxx--

各部分の Content-Type ヘッダーの後の余分な改行に注意してください。

また、最後の境界セパレーターには末尾に -- が追加されていることを忘れないでください。

于 2012-08-05T21:01:15.513 に答える
0

http リクエストの形式が正しくありません。bigquery はこれを読み込みジョブとして認識しません。夕食に出かける途中なので、これ以上詳しい調査はできませんが、先へ進むための指針となれば幸いです。

もう少し詳しく調べましたが、あなたのリクエストに間違いはありません。1 つの提案として、bigquery UI で同じ読み込みを行い、chrome ツール -> 開発者ツール / ネットワーク タブを使用して、送信される RPC を確認することをお勧めします。

ダミーの csv ファイルでこれを行うと、次のようになります。

--yql9f05215ct
Content-Type: application/json; charset=utf-8

{"jobReference":{"projectId":"helixdata2"},"configuration":{"load":{"destinationTable":{"projectId":"helixdata2","datasetId":"lotsOdata","tableId":"import"}}}}
--yql9f05215ct
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64

YSxiLGMKYyxkLGUKZixnLGgK
--yql9f05215ct--
于 2012-08-04T02:57:30.073 に答える