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

Posted

技术标签:

【中文标题】如何使用 python API 在 bigquery 中创建新视图?【英文标题】:How can I create a new view in bigquery using the python API? 【发布时间】:2015-10-20 17:49:13 【问题描述】:

我有一些代码可以自动生成一堆不同的 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 吗?

谢谢

*** 针对 Felipe 的 cmets 的一些附加问题。

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

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

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

架构呢?

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

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

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

谢谢, 布拉德

【问题讨论】:

【参考方案1】:

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

【讨论】:

现在可以通过 view_use_legacy_sql 方法使用标准 SQL,例如:table.view_query = viewSQL table.view_use_legacy_sql = False 这似乎不再起作用了,我得到AttributeError: 'TableReference' object has no attribute 'create'【参考方案2】:

注意:这与库的 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】:

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

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

https://cloud.google.com/bigquery/querying-data#views https://cloud.google.com/bigquery/docs/reference/v2/tables#resource

【讨论】:

谢谢,我不确定我是否在追逐一些永远不会成功的东西。我有一些更具体的问题,但我会将它们添加到原始帖子中。 使用bq 工具创建视图,但使用--apilog 选项。这将准确显示调用中使用了哪些参数。 太棒了,我明天回去工作时试试这个。 如何创建 etag?它说这是“此资源的哈希”,但我不明白这是什么意思。它只是我在客户端生成的随机生成的哈希码,还是需要其中的特定内容? 你没有,它说[仅输出]【参考方案4】:

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)

【讨论】:

谢谢!我面临的第一个问题是无论如何,我的代码都会创建一个表而不是视图,然后我看到了你的答案。

以上是关于如何使用 python API 在 bigquery 中创建新视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google BigQuery 的记录中查询字符串?文档不工作

如何使用 Python 创建 API 页面

如何使用 ctypes 在 python 中正确包装 C API?

如何通过谷歌翻译api在python中使用api键

如何在python中使用github api token进行请求

如何使用 JSON 正确读取 API 并创建列表?在 Python 中