1

现在我已经通过 BQ 界面安排了查询。它们工作但不能很好地扩展或迁移(跨开发和生产 gcp 项目)。因此,我尝试以可重现、可扩展和可迁移的方式进行预定查询。

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

这是最复杂的查询:

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 操作安排它们。

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

谢谢。

4

1 回答 1

1

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

  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
于 2022-02-10T13:33:50.023 回答