现在我已经通过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
命令以时间戳作为变量运行它,如本答案所示。它的问题是,我仍然必须手动创建按需查询,并且我必须在开发和生产项目中分别进行 - 我找不到使用
bq
cmd创建按需查询的方法 - 我无法
bq query
来运行查询(这根本不是创建bq调度的查询(。然后稍后通过gihub动作安排它们
任何关于正确语法的帮助或更好的建议都将对我非常有帮助。
谢谢。
在bq
命令中插入查询时,我用来解决scape字符问题的方法是在shell上使用jq
,在文件上使用我的查询,如下所示:
- 使用查询脚本创建
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 || ');'
- 创建以下脚本: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