我试图在 BigQuery 上创建一个表 - 我有一个数据集,需要使用 api 添加一个表并从云存储导入数据 (json.tar.gz)。我需要能够使用 ruby 客户端来自动化整个过程。我有两个问题:
我已经阅读了文档并试图让它上传(下面的代码)并且没有成功并且完全不知道我做错了什么。有人可以启发我或指出我正确的方向吗?
一旦我提出请求,我怎么知道工作何时真正完成?从 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"=>"上传必须发送到上传网址。将此请求重新发送到https://www.googleapis.com/upload/bigquery/v2/projects/XXXXXXXX/jobs "}], "code"=>400, "message"=>"上传必须是发送到上传 URL。将此请求重新发送到https://www.googleapis.com/upload/bigquery/v2/projects/XXXXXXXX/jobs "}}
从请求标头来看,它似乎要转到错误所说的应该转到的同一个 URI,我不知道如何继续。任何帮助将非常感激。
谢谢你,祝你有美好的一天!