繁体   English   中英

如何创建使用 Python 调用脚本/存储过程的 BigQuery 计划查询?

[英]How do I create a BigQuery Scheduled Query that calls a script/stored procedure with Python?

我正在尝试修改我继承的 python 脚本(我是 Python 的新手),它创建位于 json 文件中的 BigQuery 计划查询。 这个脚本工作正常,直到我需要向它添加一个存储过程。

存储过程没有目标表、目标数据集或写入首选项。 但是,如果我将这些 null 留空或不传递它们,我会收到错误消息,告诉我需要提供目标表和数据集。 如果我通过了它们,那么 BigQuery 会告诉我我没有脚本的目标表。 我发现了很多关于简单设置的文档,但没有关于调用脚本的文档。

以下是我到目前为止所拥有的示例。

json

{
    "query_file": "./scheduled/gaps.sql",
    "schedule": "Every 15 Minutes",
    "dest_dataset": "dataset",
    "dest_table": "gaps"
},
{
        "query_file": "./scheduled/stored_procedure.sql",
        "schedule": "Every 15 Minutes",
        "dest_dataset": "",
        "dest_table": ""
    }

调用它的地方,它与文档中的非常相似

transfer_config = bigquery_datatransfer.TransferConfig(

    destination_dataset_id=schedule.dest_dataset,
    display_name=schedule.formatted_display_name(),
    data_source_id="scheduled_query",
    params={
        "query": query.replace("${project}.", f"{self._project_id}."),
        "destination_table_name_template": schedule.dest_table,
         "write_disposition": "WRITE_TRUNCATE",
        "partitioning_field": ""
    },
    schedule=schedule.schedule
)

result = self._transfer_client.create_transfer_config(
    bigquery_datatransfer.CreateTransferConfigRequest(
        parent=self._parent,
        transfer_config=transfer_config,
        service_account_name=self._service_account_name
    ),
)

计划查询旨在运行...查询。 存储过程不是查询,它是一个过程,您可以从查询中调用它。

该介绍告诉您您有 2 种类型 object:查询和存储过程。 您必须在 JSON 模式中进行改进并添加 object 的类型(查询、function、过程、视图等),并且您的代码需要相应地执行不同的 BigQuery API 调用。

但是,请注意,该设计中存在一个陷阱,因为某些 object 可能与其他人存在依赖关系。 例如,您创建了一个存储过程和一个使用该存储过程的查询。 存储过程必须在预定查询之前创建,否则会失败。

所以,你要解决的问题并不简单。 这就是为什么对于那些类型的依赖关系和配置,像 Terraform 这样的 IaC(基础设施即代码)工具在管理依赖关系(显式或隐式)方面非常强大。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM