首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BigQuery联邦数据源的API配置

BigQuery联邦数据源的API配置
EN

Stack Overflow用户
提问于 2018-03-22 16:19:09
回答 3查看 460关注 0票数 0

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

代码语言:javascript
复制
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的情况下执行以下操作:

代码语言:javascript
复制
result = client.execute(
  api_method: big_query.jobs.insert,
  parameters: { projectId: 'my_project', datasetId: 'my_dataset' },
  body_object: config
)  

现在,我正在尝试编写等效的代码来创建一个外部/联邦数据源,而不是加载数据。我需要这样做,以便为ETL目的有效地创建暂存表。我已经使用BigQuery UI成功地做到了这一点,但是需要在代码中运行,因为它最终将是一个日常的自动化过程。我在API文档上遇到了一些麻烦,找不到任何可以参考的好例子。有人能帮忙吗?提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-24 10:36:47

对于任何尝试相同的人来说,这是我过去用来让它工作的东西。网上的工作示例不多,文档需要一些破译,所以希望这对其他人有帮助!

代码语言:javascript
复制
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

代码语言:javascript
复制
result = client.execute(
    api_method: big_query.tables.insert,
    parameters: { projectId: my_project, datasetId: my_dataset },
    body_object: config
)
票数 1
EN

Stack Overflow用户

发布于 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'

票数 2
EN

Stack Overflow用户

发布于 2018-04-02 12:30:08

在可能的情况下使用习惯云库

使用一般可用的GCP 惯用Ruby客户端中的惯用Ruby客户端模块,而不是google ruby客户端,后者既处于“维护模式”,又处于"alpha“状态。您可以找到这个建议这里这里

认证:

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

如何创建外部数据源对象

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

代码语言:javascript
复制
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

对象配置方法是这里。例如:autodetectmax_bad_recordsurls等。

如何查询:

代码语言:javascript
复制
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”一节 for externalDataConfiguration中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49433598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档