迭代存储过程 BigQuery 中的行

Posted

技术标签:

【中文标题】迭代存储过程 BigQuery 中的行【英文标题】:Iterate over rows in Stored Procedure BigQuery 【发布时间】:2019-12-18 16:35:27 【问题描述】:

有没有办法在存储过程中获取查询结果,然后遍历 BigQuery 中的行?每行都有一个光标之类的东西。

这是我的存储过程,它需要 6 个参数,我从表中获取这些参数。我想调用该过程 X 次(X 是我的输入表的行数)。所以像:

对于 device_id、nb_measures、delta_t_min、delta_t_last_rec、date_cr、帧 IN(选择 device_id、nb_measures、delta_t_min、delta_t_last_rec、date_cr、frame FROM my_project.my_dataset.my_table

BEGIN
  DECLARE count INT64 DEFAULT 0;
  SET temp_list = [];
  WHILE count < nb_measures DO
    SET temperature = `bdz-dts-datascience-dev.fonctions.hexStringToInt`(frame, 5 + count, 1, 0, 8);
    IF temperature != 127 THEN
      IF count = 0 THEN
        SET measure_time = TIMESTAMP_SUB(date_cr, INTERVAL delta_t_last_rec MINUTE);
      ELSE
        SET measure_time = TIMESTAMP_SUB(date_cr, INTERVAL delta_t_last_rec + count * delta_t_min MINUTE);
      END IF;
      INSERT `20191218_temperature_repeteurs.step_2`(device_id, measure_time, temperature)
        VALUES(measure_time, temperature);
  END IF;
  END WHILE;
END;

或者另一方面,有没有办法在 SELECT 查询中执行存储过程来遍历结果?

SELECT 
  device_id, nb_mesures, delta_t_min, delta_t_last_rec, date_cr, frame
  CALL `my-dataset.my_procedure`(device_id, nb_mesures, delta_t_min, delta_t_last_rec, date_cr, frame)
FROM `my_project.my_dataset.my_table`)

【问题讨论】:

【参考方案1】:

这是一个示例,说明如何使用取自 here 的存储过程对行进行迭代

-- The input variable is employee’s employee_id (target_employee_id)
  -- The output variable (OUT) is employee_hierarchy which lists
  --      the employee_id of the employee’s manager
CREATE PROCEDURE dataset.GetEmployeeHierarchy(
  target_employee_id INT64, OUT employee_hierarchy ARRAY<INT64>)
BEGIN
  -- Iteratively search for this employee's manager, then the manager's
  -- manager, etc. until reaching the CEO, who has no manager.
  DECLARE current_employee_id INT64 DEFAULT target_employee_id;
  SET employee_hierarchy = [];
  WHILE current_employee_id IS NOT NULL DO
    -- Add the current ID to the array.
    SET employee_hierarchy =
      ARRAY_CONCAT(employee_hierarchy, [current_employee_id]);
    -- Get the next employee ID by querying the Employees table.
    SET current_employee_id = (
      SELECT manager_id FROM dataset.Employees
      WHERE employee_id = current_employee_id
    );
  END WHILE;
END;

【讨论】:

我在 Google 的存储过程教程中看到了该示例,但是我不想做的是在没有任何条件的情况下循环查询结果。我会更新我的问题以使其更清楚【参考方案2】:

不能在 SELECT 中调用存储过程。你可以做的是创建一个用户定义的函数[1],例如:

CREATE TEMP FUNCTION my_udf(a INT64, b INT64, c INT64, d INT64) AS (....);

然后:

SELECT 
  device_id, nb_mesures, delta_t_min, delta_t_last_rec, date_cr, frame,
  my_udf(device_id, nb_mesures, delta_t_min, delta_t_last_rec, date_cr, frame)
FROM `my_project.my_dataset.my_table`)

[1]https://cloud.google.com/bigquery/docs/reference/standard-sql/user-defined-functions

【讨论】:

以上是关于迭代存储过程 BigQuery 中的行的主要内容,如果未能解决你的问题,请参考以下文章

为啥 H2 在存储过程中的行继续“\”处犹豫不决?

Bigquery - 安排存储过程不再工作

如何使用apache气流调度谷歌云bigquery存储过程

使用 Spring Boot 调用 BigQuery 存储过程(例程)

通过将列和表名作为参数传递来创建 BigQuery 存储过程

BigQuery Web UI:显示存储过程的结果需要哪些权限?