寻求有关 BQ 查询的帮助。我是 BigQuery 和 SQL 的新手,所以请保持温柔;)。 我有一个 10 行 2 列的 BQ 表。我的目的是运行另一个 BQ 查询,迭代单元格值。并为每次迭代创建一个新表。
我想象这类似于在 Python 中运行 for 循环,迭代字典的键、值对。
我有的桌子:
示例_表:
A 栏 | B 栏 |
---|---|
val_1a | val_1b |
val_2a | val_2b |
我想做的事:
for col1_cell, col2_cell in example_table:
bq query
我尝试了 FOR IN 过程,如下所述:https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#iterate
FOR value IN (
SELECT val1, val2
FROM `my_dataset.example_table`
)
DO
CREATE OR REPLACE TABLE `my_dataset.new_table`
AS(
SELECT
<<My query here>>
);
END FOR;
这会创建 new_table,但值会被覆盖,仅创建 1 个表。
当我尝试声明变量时,出现“预期输入结束但获得关键字 FOR”或“仅在块或脚本开头允许变量声明”错误
DECLARE my_array ARRAY<STRUCT<val1 STRING, val2 STRING>>;
SET my_project_service = (
SELECT ARRAY_AGG(STRUCT(col1, col2))
FROM `from_my_dataset.my_table`
);
FOR my_array IN (
SELECT val1, val2
FROM `my_dataset.example_table`
)
DO
CREATE OR REPLACE TABLE `my_dataset.new_table`
AS(
SELECT
<<My query here>>
);
END FOR;
感谢任何帮助,谢谢。
正如评论者提到的,这在 BigQuery 中是可能的;您可以使用
EXECUTE IMMEDIATE
来运行您预先构建为字符串的 SQL 命令。
这是一个最小的示例,说明如何执行您想要完成的任务:
FOR value IN (
SELECT a, b
FROM (
SELECT 1 AS a, 2 AS b
UNION ALL
SELECT 3 AS a, 2 AS b
)
)
DO EXECUTE IMMEDIATE """
SELECT """
|| CAST(value.a AS STRING)
|| """ AS x
""";
END FOR;
在 BigQuery UI 中运行此命令的结果如下所示:
出现三个查询:
SELECT
包含列a
和b
value
并包含字段 a
和 b
DO
一些东西。我们所做的是EXECUTE IMMEDIATE
一些SQL,即运行SQL查询这些循环查询的本质是什么?
使用字符串连接运算符
||
和多行字符串语法 """
,我们将三个不同的位粘在一起:
SELECT
value.a
,类型转换为字符串(这是第一个循环上的 "1"
,第二个循环上的 "3"
) AS x
因此,在第一个循环中,查询将创建如下:
SELECT 1 AS x
(这几乎是您可以在 BigQuery 中运行的最简单的查询;它返回一行,其中包含名为
1
的单列中的值 x
)
...在第二个循环中我们将执行
SELECT 3 AS x
。
在您的情况下,您可以将
SELECT
替换为 CREATE OR REPLACE TABLE
并使用实际查询来定义表。
我的直觉说“不”。
有时您会遇到一些限制,这意味着您必须在 BigQuery 中完成所有操作;对于这些情况,这是一组非常强大的功能。
不过,大多数时候,最好使用脚本语言(您自己提到过 Python)来指示 BigQuery 运行一组查询。如果可以的话,我建议使用官方 Python 客户端库 google-cloud-bigquery。