Bigquery-版本控制计划查询



现在我已经通过BQ接口安排了查询。它们可以工作,但不能很好地扩展或迁移(跨开发和生产gcp项目(。因此,我尝试以一种可复制、可扩展和可迁移的方式进行调度查询。

我的查询很复杂,因此我很难使用'"''',使其通过bq命令运行,并通过github操作进行调度。

这是最复杂的查询:

declare bq_last_id int64;
declare external_sql string;
set bq_last_id = (select max(id) from bq_dataset.bq_table);
set external_sql = '"select * from mysql_table where id > ('|| bq_last_id ||')"';
execute immediate 'select * from external_query("my-gcp-project.my-region.my-connection-name",'|| external_sql || ');'

总共有20多个查询需要安排。这是唯一一个是增量的,或者其他是再次删除并重新创建表,所以它们不像这一个那么复杂。

到目前为止我一直在尝试:

  • 在BQ接口中创建一个按需查询,然后使用bq mk命令以时间戳作为变量运行它,如本答案所示。它的问题是,我仍然必须手动创建按需查询,并且我必须在开发和生产项目中分别进行
  • 我找不到使用bqcmd创建按需查询的方法
  • 我无法bq query来运行查询(这根本不是创建bq调度的查询(。然后稍后通过gihub动作安排它们

任何关于正确语法的帮助或更好的建议都将对我非常有帮助。

谢谢。

bq命令中插入查询时,我用来解决scape字符问题的方法是在shell上使用jq,在文件上使用我的查询,如下所示:

  1. 使用查询脚本创建queries.sql文件:
cat queries.sql
declare bq_last_id int64;
declare external_sql string;
set bq_last_id = (select max(id) from bq_dataset.bq_table);
set external_sql = '"select * from mysql_table where id > ('|| bq_last_id ||')"';
execute immediate 'select * from external_query("my-gcp-project.my-region.my-connection-name",'|| external_sql || ');'
  1. 创建以下脚本:schedule_query.sh
#!/bin/bash
set -f #avoind * used as wildcard
json=$(jq -nc --arg query "$(<queries.sql)" '{ "query": $query }')
#adapt the command and param to work in your environment (destination, tables, etc...)
bq mk 
--transfer_config 
--target_dataset=mydataset 
--display_name='My Scheduled Query' 
--params="$json" 
--data_source=scheduled_query 
--service_account_name=abcdef-test-sa@abcdef-test.iam.gserviceaccount.com

最新更新