Многократная операция удаления в bigquery с использованием хранимой процедуры - PullRequest
0 голосов
/ 25 февраля 2020

Мне нужно удалить строки из таблицы. Операция удаления может иметь разные периоды ограничений и разные условия, тогда я хотел бы использовать хранимую процедуру для создания динамического c оператора удаления.

Условия оператора удаления сохраняются в виде таблицы следующее:

dataset.delete_conditions:

group   lower_event_limit   upper_event_limit

A.      2020-02-01          2020-02-10

B       2020-01-01          2020-01-03

C       2020-02-05          2020-02-07

Я хотел бы произвести что-то вроде этого:

CREATE PROCEDURE delete_irrelevant_data(s_group STRING, d_lower_event_limit DATE, d_upper_event_limit DATE)

BEGIN 

IF d_lower_event_limit IS NOT NULL AND d_upper_event_limit IS NOT NULL 

  THEN 

      delete from data_set.fact_table 
      where date between d_lower_event_limit AND d_upper_event_limit 
      and group = s_group;

END IF; 

END;


select
  delete_irrelevant_data(group, lower_event_limit, upper_event_limit) 
from 
( select group, 
         lower_event_limit,
         upper_event_limit
  from dataset.delete_conditions
)

Это не работает. Я полагаю, что мне нужно использовать массив и l oop, но я не могу сформулировать его.

1 Ответ

0 голосов
/ 25 февраля 2020

Ошибка, по-видимому, связана с процедурами , требующими вызова CALL. Я думаю, что вы могли бы использовать scripting для этого. Например:

-- Get the delete conditions
DECLARE delete_conditions DEFAULT (ARRAY(SELECT AS STRUCT sgroup, 
         lower_event_limit,
         upper_event_limit
  from my_dataset.delete_conditions));  

-- Declare variable for the loop
DECLARE size DEFAULT (SELECT ARRAY_LENGTH(delete_conditions));
DECLARE i DEFAULT 0;
DECLARE conditions DEFAULT (delete_conditions[OFFSET(0)]);

-- Create or repleace procedure. This can be done outside of the script
CREATE OR REPLACE PROCEDURE my_dataset.delete_irrelevant_data(s_group STRING, d_lower_event_limit DATE, d_upper_event_limit DATE)
BEGIN 
DELETE FROM my_dataset.my_table_to_delete WHERE sgroup = s_group; -- And additional conditions
END;

-- Loop
WHILE i < size DO

  SET conditions = delete_conditions[OFFSET(i)];

  -- Procedures are invoked by using CALL
  CALL my_dataset.delete_irrelevant_data(conditions.sgroup, conditions.lower_event_limit, conditions.upper_event_limit);

  SET i = i+1;

END WHILE;

Еще одна вещь, которую следует учитывать, это то, что при таком подходе вы можете набрать несколько квот , поэтому, если вы делаете много удалений, вы можете попробовать также сгруппировать некоторые из удалений перед выполнением операторов DELETE.

...