Google BQ:运行参数化查询,其中参数变量是BQ表目标
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Google BQ:运行参数化查询,其中参数变量是BQ表目标相关的知识,希望对你有一定的参考价值。
我正在尝试从Linux命令行运行SQL以获取BQ表目标。此SQL脚本将用于多个日期,客户端和BQ表目标,因此这需要在我的BQ API命令行调用中使用参数(标志 - 参数)。现在,我已经按照这个链接来了解参数化查询:https://cloud.google.com/bigquery/docs/parameterized-queries,但它在帮助我声明表名方面是有限的。
我的SQL脚本名为Advertiser_Date_Check.sql,如下所示:
#standardSQL
SELECT *
FROM (SELECT *
FROM @variable_table
WHERE CAST(_PARTITIONTIME AS DATE) = @variable_date) as final
WHERE final.Advertiser IN UNNEST(@variable_clients)
参数变量表示以下内容:
- variable_table:我想要调用的BQ表目标
- variable_date:我想从BQ表中提取的日期
- variable_clients:我想从数据中提取的特定客户端的数组列表(从我引用的日期开始)
现在,我的BQ数据的命令行(LINUX)如下
TABLE_NAME=table_name_example
BQ_TABLE=$(echo '`project_id.dataset_id.'$TABLE_NAME'`')
TODAY=$(date +%F)
/bin/bq query --use_legacy_sql=false
--parameter='variable_table::'$BQ_TABLE''
--parameter=variable_date::"$TODAY"
--parameter='variable_clients:ARRAY<STRING>:["Client_1","Client_2","Client_3"]'
"`cat /path/to/script/Advertiser_Date_Check.sql`"
@variable_date和@variable_clients的参数在过去只是它们时运行得很好。但是,由于我希望在循环中的各个表上运行这个精确的SQL命令,因此我创建了一个名为variable_table的参数。参数化查询必须采用标准SQL格式,因此表名约定必须采用以下格式:
`project_id.dataset_id.table_name`
每当我尝试在命令行上运行它时,我通常会收到以下错误:
Error in query string: Error processing job ... : Syntax error: Unexpected "@" at [4:12]
这是参考@variable_table参数,因此很难处理这是引用表名。在过去的尝试中,甚至出现了错误:
project_id.dataset_id.table_name: command not found
但这主要是由于表目的地名称参考不当造成的。第一个错误是最常见的错误。
总的来说,我对此事的疑问是:
- 如何在FROM子句的参数化查询的命令行中引用BQ表作为参数(例如我尝试使用@variable_table)?它甚至可能吗?
- 你知道从命令行运行多个BQ表的查询的其他方法,除了我目前正在做的方式吗?
希望这一切都有意义,谢谢你的帮助!
从您链接的文档:
参数不能用作标识符,列名,表名或查询的其他部分的替代。
我认为在这种情况下可能对你有用的是将表名注入为常规shell变量(而不是查询参数)。您需要确保您信任它的内容,或者您自己构建字符串以避免SQL注入。一种方法是为表名提供硬编码常量,然后根据用户输入选择要插入查询文本的常量。
以上是关于Google BQ:运行参数化查询,其中参数变量是BQ表目标的主要内容,如果未能解决你的问题,请参考以下文章