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

时间:2015-10-20 17:49:14

标签: python google-bigquery

我有一些代码会自动生成一堆不同的SQL查询,我想插入bigquery来生成视图,但我遇到的一个问题是这些视图需要每晚动态生成,因为数据的性质不断变化。所以我希望能够使用google bigquery api for python来创建视图。我知道如何使用' bq'命令行工具,但我希望能够将其直接构建到代码中,而不是使用shell来运行bq。我玩过

提供的代码

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

我不明白如何使用这段代码来创建视图,而不仅仅是返回SELECT语句的结果。我可以在这里看到关于进行表插入的文档

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

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

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

由于

***针对费利佩的评论提出了一些其他问题。

表资源文档表明存在许多必填字段,即使我不完全理解他们要求的内容,其中一些字段也没有意义。例如,externalDataConfiguration.schema。这是指我要连接的数据库的模式(我假设它是什么),还是用于存储数据的模式?

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

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

架构怎么样?

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

Type是view,view.query是用于制作视图的实际sql查询。所以我知道为什么这些是观看所必需的,但我不了解其他部分。

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

谢谢, 布拉德

4 个答案:

答案 0 :(得分:6)

使用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

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

注意:这改变了0.28.0的库 - 请参阅以下内容以获取更多详细信息: Google BigQuery: creating a view via Python google-cloud-bigquery version 0.27.0 vs. 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

答案 3 :(得分:0)

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

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

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

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)