BigQuery联合数据源的API配置

我有以下配置适用于将一堆文件加载到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 ) 

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

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

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

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

尽可能使用惯用的云库

在惯用的Ruby客户端中使用BigQuery模块,通常是可用的GCP,而不是google-api-ruby-client ,它们都处于“仅维护模式”和“alpha”状态。 你可以在这里和这里找到这个推荐。

validation:

您可以使用环境变量定义项目和访问。

如何创建外部数据源对象

这是使用bigquery.external创建外部数据源的示例 。 我稍微修改了它,以便从您的解决方案中添加相关配置。

 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 

对象配置方法在这里 。 例如: max_bad_recordsmax_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表的加载/复制/查询作业,对外部数据源没有多大意义。 实际上,它们既不出现在REST API参考中,也不出现在externalDataConfiguration “试用此API”部分中。

对于任何尝试相同的人来说,这就是我以前的工作方式。 网上没有很多工作示例,文档需要进行一些解密,所以希望这有助于其他人!

 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 REST API参考和bigquery.tables.insert “试用此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 )