如何使用 python API 在 bigquery 中创建新视图?

How can I create a new view in bigquery using the python API?

我有一些代码可以自动生成一堆不同的 SQL 查询,我想将这些查询插入到 bigquery 中以生成视图,尽管我遇到的一个问题是这些视图需要由于数据的性质不断变化,每晚都会动态生成。所以我想做的是使用 google bigquery api for python 来创建视图。我了解如何使用 'bq' 命令行工具来完成此操作,但我希望能够将其直接内置到代码中,而不是使用 shell 到 运行 bq .我玩过

提供的代码

https://cloud.google.com/bigquery/bigquery-api-quickstart

我不明白如何使用这段代码来创建视图而不只是返回 SELECT 语句的结果。我可以在此处

查看有关执行 table 插入的文档

https://cloud.google.com/bigquery/docs/reference/v2/tables/insert

但这指的是使用 REST API 生成新的 table,而不是上面提供的示例。

这不可能吗?我应该放弃并使用 bq 吗?

谢谢

*** 针对 Felipe 评论的一些补充问题。

table 资源文档指出有许多必填字段,其中一些是有意义的,即使我不完全理解他们的要求,其他的则不理解。例如,externalDataConfiguration.schema。这是指我正在连接的数据库的架构(我假设它是),还是用于存储数据的架构?

externalDataConfiguration.sourceFormat呢?由于我正在尝试查看预先存在的数据库,因此我不确定我是否了解源格式的相关性。它是我正在查看的数据库的源格式吗?我如何识别它?

AND externalDataConfiguration.sourceUris[],我没有将新数据导入数据库,所以我不明白这个(或前一个元素)是如何需要的。

模式呢?

tableReference.datasetId、tableReference.projectId 和 tableReference.tableId 是不言自明的。

Type 将是视图,view.query 将是用于生成视图的实际 sql 查询。所以我明白为什么制作视图需要这些,但我不明白其他部分。

你能帮我理解这些细节吗?

谢谢, 布拉德

web UI 或 bq 工具所做的一切都是通过 BigQuery API 完成的,所以不要放弃:)。

创建视图类似于创建 table,只是确保在调用 tables.insert() 时拥有包含视图 属性 的 table 资源。

使用https://cloud.google.com/bigquery/docs/reference/rest/v2/tables/insert

提交如下内容,假设您添加了授权

{
  "view": {
    "query": "select column1, count(1) `project.dataset.someTable` group by 1",
    "useLegacySql": false
  },
  "tableReference": {
    "tableId": "viewName",
    "projectId": "projectName",
    "datasetId": "datasetName"
  }
}

或者在 Python 中使用,假设您有服务密钥设置和环境变量 GOOGLE_APPLICATION_CREDENTIALS=/path/to/my/key。需要注意的是,据我所知,这只能使用遗留 sql 创建视图,并且作为扩展只能使用遗留 sql 进行查询,尽管直接 API 方法允许传统或标准。

from google.cloud import bigquery

def create_view(dataset_name, view_name, project, viewSQL):

    bigquery_client = bigquery.Client(project=project)

    dataset = bigquery_client.dataset(dataset_name)
    table = dataset.table(view_name)

    table.view_query = viewSQL

    try:
        table.create()
        return True
    except Exception as err:
        print(err)
        return False

注意:这在库的 0.28.0 中略有变化 - 有关更多详细信息,请参阅以下内容:

我的示例函数

# create a view via python
def create_view(dataset_name, view_name, sqlQuery, project=None):
    try:

        bigquery_client = bigquery.Client(project=project)
        dataset_ref = bigquery_client.dataset(dataset_name)
        table_ref = dataset_ref.table(view_name)
        table = Table(table_ref)
        table.view_query = sqlQuery
        table.view_use_legacy_sql = False
        bigquery_client.create_table(table)

        return True

    except Exception as e:
        errorStr = 'ERROR (create_view): ' + str(e)
        print(errorStr)
        raise

bigquery.版本 -> '1.10.0'

def create_view(client, dataset_name, view_name, view_query):
    try:
        dataset_ref = client.dataset(dataset_name)
        view = dataset_ref.table(view_name)
        # view.table_type = 'VIEW'
        view.view_query = view_query
        view.view_query_legacy_sql  = False
        client.create_table(view)
        pass
    except Exception as e:
        errorStr = 'ERROR (create_view): ' + str(e)
        print(errorStr)
        raise

创建 table 而不是视图 !!!!

这是创建视图的正确代码:

def create_view(client, dataset_name, view_name, view_query):
    try:
        dataset_ref = client.dataset(dataset_name)
        view_ref = dataset_ref.table(view_name)
        table = bigquery.Table(view_ref)
        table.view_query = view_query
        table.view_use_legacy_sql = False
        client.create_table(table)
    except Exception as e:
        errorStr = 'ERROR (create_view): ' + str(e)
        print(errorStr)
        raise

有必要

table = bigquery.Table(view_ref)