我有以下配置可以很好地将一堆文件加载到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文档时遇到了一些麻烦,但找不到任何好的示例。有人可以帮忙吗?提前致谢!
答案 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”状态。您可以找到此推荐here和here。
您可以使用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。例如:autodetect
,max_bad_records
,urls
等
data = bigquery.query "SELECT * FROM my_ext_table",
external: { my_ext_table: json_table }
data.each do |row|
puts row[:name]
end
注意:此外,writeDisposition
和createDisposition
仅用于修改永久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
)