我有以下配置,可以很好地将一堆文件加载到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文档上遇到了一些麻烦,找不到任何可以参考的好例子。有人能帮忙吗?提前感谢!
发布于 2018-03-24 10:36:47
对于任何尝试相同的人来说,这是我过去用来让它工作的东西。网上的工作示例不多,文档需要一些破译,所以希望这对其他人有帮助!
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。
然后,正如在华张的回答中指出的,您运行的是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
)发布于 2018-03-23 17:59:33
通过创建外部数据源,是否意味着创建引用外部数据源的表?在这种情况下,您可以使用bigquery.tables.insert并填写externalDataConfiguraiton。然后,可以在查询中使用该表从外部数据源读取数据。
如果只想在一个查询中使用外部数据源,则可以通过将表定义放置到tableDefinitions,将临时外部表与查询附加在一起。在命令行中,如下所示:
bq query --external_table_definition=avroTable::AVRO=gs://path-to-avro 'SELECT * FROM avroTable'
发布于 2018-04-02 12:30:08
在可能的情况下使用习惯云库
使用一般可用的GCP 惯用Ruby客户端中的惯用Ruby客户端模块,而不是google ruby客户端,后者既处于“维护模式”,又处于"alpha“状态。您可以找到这个建议这里和这里。
认证:
您可以使用环境变量定义项目和访问。
如何创建外部数据源对象
这是用一个例子创建外部数据源的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对象配置方法是这里。例如: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表的加载/复制/查询作业,对外部数据源没有多大意义。事实上,它们既没有出现在REST引用中,也没有出现在“试试这个API”一节 for externalDataConfiguration中。
https://stackoverflow.com/questions/49433598
复制相似问题