迭代 BigQuery 中的值 - 类似于迭代字典中的键值对

问题描述 投票:0回答:1

寻求有关 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;

感谢任何帮助,谢谢。

google-bigquery
1个回答
0
投票

正如评论者提到的,这在 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查询
  • 因此,运行了三个 SQL 查询

这些循环查询的本质是什么?

使用字符串连接运算符

||
和多行字符串语法
"""
,我们将三个不同的位粘在一起:

  1. SELECT 
  2. value.a
    ,类型转换为字符串(这是第一个循环上的
    "1"
    ,第二个循环上的
    "3"
  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

© www.soinside.com 2019 - 2024. All rights reserved.