私は公式の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}"}