BigQuery 存储过程,用于捕获表名以及该表名的记录数
Posted
技术标签:
【中文标题】BigQuery 存储过程,用于捕获表名以及该表名的记录数【英文标题】:BigQuery stored procedure to capture table name along with number of records for that table name 【发布时间】:2020-11-03 18:32:43 【问题描述】:我在 BigQuery 中创建了以下存储过程,以获取表名列表以及每个表名的计数。我遇到了 2 个我无法解决的问题。
#1 - 如何在我的“立即执行”Sql 语句中为每个表执行计数?
#2 - 我的数组结果“tbl_lst_array”包含超过 800 个表,但存储过程(执行时)只返回 100 行。是因为 Google 强加了以下配额吗? https://cloud.google.com/bigquery/quotas
我通过循环一次处理一张表。
感谢您的帮助。
create procedure SP_MERGE.SP_bq_table_counts()
BEGIN
DECLARE tbl_lst_array ARRAY<STRING>;
DECLARE i INT64 DEFAULT 1;
CREATE TEMP TABLE tbl_results(field STRING);
SET tbl_lst_array = (SELECT ARRAY_AGG(table_schema||'.'||table_name) FROM `tng-edw-data-dev`.EDW.INFORMATION_SCHEMA.TABLES);
WHILE (i < ARRAY_LENGTH(tbl_lst_array)) DO
EXECUTE IMMEDIATE '''
INSERT tbl_results
SELECT "''' || tbl_lst_array[ORDINAL(i)] || '''"
''';
# Increment counter
SET i = i + 1;
END WHILE;
select * from tbl_results;
END;
【问题讨论】:
【参考方案1】:你的观点是正确的。不要为每次迭代执行 1 个插入作业,而是确保您收集/连接它们并在循环结束时执行 1 个包含所有行的单个插入作业。这样可以避免并发作业限制。
【讨论】:
以上是关于BigQuery 存储过程,用于捕获表名以及该表名的记录数的主要内容,如果未能解决你的问题,请参考以下文章