如何使用 ruby api 创建一个 bigquery 表并从云存储导入
Posted
技术标签:
【中文标题】如何使用 ruby api 创建一个 bigquery 表并从云存储导入【英文标题】:How to create a bigquery table and import from cloud storage using the ruby api 【发布时间】:2013-11-13 11:49:53 【问题描述】:我正在尝试在 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"=>"上传必须发送到上传URL。重新发送此请求发送至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,我不知道如何继续。任何帮助将不胜感激。
谢谢你,祝你有美好的一天!
【问题讨论】:
【参考方案1】:由于这是一个“媒体上传”请求,因此发出请求的协议略有不同。 ruby 文档http://rubydoc.info/github/google/google-api-ruby-client/file/README.md#Media_Upload 更详细地描述了它。我会使用可恢复上传而不是分段上传,因为它更简单。
是的,正如您所怀疑的,知道何时完成的方法是执行 jobs.get() 来查找正在运行的作业的状态。作业 ID 将在 jobs.insert() 的响应中返回。如果您想要更多控制,您可以传递您自己的作业 ID,以便在 jobs.insert() 调用返回错误的情况下,您可以查明作业是否实际开始。
【讨论】:
【参考方案2】:谢谢你。答案已解决。请看这里: How to import a json from a file on cloud storage to Bigquery
我认为可恢复上传部分 (http://rubydoc.info/github/google/google-api-ruby-client/file/README.md#Media_Upload) 的文档中的代码行应为:
result = client.execute(:api_method => drive.files.insert,
否则,这行会抛出一个错误,'result' undefined:
upload = result.resumable_upload
【讨论】:
以上是关于如何使用 ruby api 创建一个 bigquery 表并从云存储导入的主要内容,如果未能解决你的问题,请参考以下文章
如何分别使用服务帐号和 API 密钥来使用 BigQuery?
如何在 Ruby 中使用 Win32API 从 DLL 返回字符串
如何使用 google-api-ruby-client People API 传递 OAuth 令牌?