BigQuery联合数据源的API配置

时间:2018-03-22 16:19:09

标签: ruby-on-rails ruby google-cloud-platform google-bigquery google-cloud-storage

我有以下配置可以很好地将一堆文件加载到BigQuery中:

config= {
  'configuration'=> {
    'load'=> {
      'sourceUris'=> 'gs://my_bucket/my_files_*',
      'schema'=> {
        'fields'=> fields_array
      },
      'schemaUpdateOptions' => [{ 'ALLOW_FIELD_ADDITION'=> true}],  
      'destinationTable'=> {
        'projectId'=> 'my_project',
        'datasetId'=> 'my_dataset',
        'tableId'=> 'my_table'
      },
      'sourceFormat' => 'NEWLINE_DELIMITED_JSON',
      'createDisposition' => 'CREATE_IF_NEEDED',
      'writeDisposition' => 'WRITE_TRUNCATE',
      'maxBadRecords'=> 0,
    }
  },
}

然后执行以下操作,其中client已预先初始化:

result = client.execute(
  api_method: big_query.jobs.insert,
  parameters: { projectId: 'my_project', datasetId: 'my_dataset' },
  body_object: config
)  

我现在正在尝试编写等效文件来创建external / federated data source而不是加载数据。我需要这样做才能有效地创建用于ETL目的的登台表。我已成功使用BigQuery UI完成此操作,但需要在代码中运行,因为它最终将成为每日自动化过程。我在使用API​​文档时遇到了一些麻烦,但找不到任何好的示例。有人可以帮忙吗?提前致谢!

3 个答案:

答案 0 :(得分:2)

通过创建外部数据源,您的意思是创建一个引用外部数据源的表吗?在这种情况下,您可以使用bigquery.tables.insert并填写externalDataConfiguraiton。然后,该表可用于查询以从外部数据源读取。

如果您只想在一个查询中使用外部数据源,则可以通过将表定义放到tableDefinitions来附加查询的临时外部表。在命令行中,它看起来像这样:

bq query --external_table_definition=avroTable::AVRO=gs://path-to-avro 'SELECT * FROM avroTable'

答案 1 :(得分:2)

尽可能使用惯用的云库

使用G idiomatic Ruby client中的BigQuery模块(通常可用),而不是google-api-ruby-client,它们都处于“仅维护模式”和“alpha”状态。您可以找到此推荐herehere

验证:

您可以使用environment variables定义项目和访问权限。

如何创建外部数据源对象

使用bigquery.external创建外部数据源an example。我稍微对其进行了修改,以便从您的解决方案中添加相关配置。

bigquery = Google::Cloud::Bigquery.new

json_url = "gs://my_bucket/my_files_*"
json_table = bigquery.external csv_url do |json|
  json.autodetect = true
  json.format = "json"
  json.max_bad_records = 10
end

对象配置方法是here。例如:autodetectmax_bad_recordsurls

如何查询:

data = bigquery.query "SELECT * FROM my_ext_table",
                      external: { my_ext_table: json_table }

data.each do |row|
  puts row[:name]
end

注意:此外,writeDispositioncreateDisposition仅用于修改永久BigQuery表的加载/复制/查询作业,并且对于外部数据源。实际上,它们既不会出现在externalDataConfiguration中,也不出现在MAIL_DRIVER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=mymail@gmail.com MAIL_PASSWORD=mypassword MAIL_ENCRYPTION=tls 的{​​{3}}中。

答案 2 :(得分:1)

对于尝试相同的人来说,这就是我过去常常使用它的方法。网上的工作实例并不多,而且文档需要进行一些解密,所以希望这有助于其他人!

config= {
  "kind": "bigquery#table",
  "tableReference": {
    "projectId": 'my_project',
    "datasetId": 'my_dataset',
    "tableId": 'my_table'
  },
  "externalDataConfiguration": {
    "autodetect": true,
    "sourceUris": ['gs://my_bucket/my_files_*'],
    'sourceFormat' => 'NEWLINE_DELIMITED_JSON',
    'maxBadRecords'=> 10,
  }
}  

externalDataConfiguration的文档可以在bigquery.tables.insert的BigQuery REST API reference"Try this API"部分找到。

然后正如华章的回答所指出,你运行bigquery.tables.insert代替bigquery.jobs.insert

result = client.execute(
    api_method: big_query.tables.insert,
    parameters: { projectId: my_project, datasetId: my_dataset },
    body_object: config
)