GCP BigQuery - 运行不同的过程,在单个多语句查询中创建具有相同名称的临时表

问题描述 投票:0回答:1

考虑定义如下的两个不同的过程:

CREATE PROCEDURE sp.procedure_example1()
BEGIN

  CREATE TEMP TABLE tmp_table_proc_1 (_id INT);

  CREATE TEMP TABLE tmp_final (_id INT, txt_col STRING);

END;

CREATE PROCEDURE sp.procedure_example2()
BEGIN

  CREATE TEMP TABLE tmp_table_proc_2 (_id INT);

  CREATE TEMP TABLE tmp_final (_id INT, num_col NUMERIC);

END;

每个过程都有自己的一组指令,但为了简单起见,我们只考虑导致问题的部分:

  • 两者都创建一个名为
    tmp_final
    的临时表(每种情况下 DDL 都不同)
  • 所有过程都没有针对此表的
    DROP
    语句

现在,我们需要在单个多语句查询中调用这两个过程,这会触发错误。发生这种情况是因为 BigQuery 尝试为其随机生成的数据集使用相同的名称创建临时表

tmp_final
两次(创建用于存储临时表 24 小时。您可以查看文档此处

要复制错误,只需创建两个过程并在 BigQuery 控制台中运行以下语句:

CALL sp.procedure_example1();

CALL sp.procedure_example2();

如果这两个过程在不同的会话中执行,即在第一个过程完成后手动运行第二个过程,则不会发生此错误,因为用于存储临时表的数据集在会话之间发生变化。

我知道删除临时表是最小化存储成本的好主意,但考虑到这两个过程在公司内部都是规范的,并且不能轻易更改。
此外,临时表通常用于日志目的,因此在每个过程结束时删除它们不应该是我们的第一选择。

我的问题是:是否可以强制 BigQuery 在运行不同的过程时在不同的数据集中创建临时表?我尝试过使用交易,但这也不起作用。

任何帮助将不胜感激。预先感谢

google-cloud-platform google-bigquery
1个回答
0
投票

您可以在会话中将临时表视为全局变量。因此,如果您可以/想要覆盖它,请使用

create or replace
语句。

如果要保留现有数据,可以测试表是否存在,如果表存在则执行追加(或合并),或者创建。

如果该表专用于该过程,作为局部变量,请为该表使用唯一的名称。

© www.soinside.com 2019 - 2024. All rights reserved.