Google BigQuery IF / While Loop - PullRequest
       0

Google BigQuery IF / While Loop

0 голосов
/ 10 февраля 2020
DECLARE var1 INT64;
SET var1=(select * from abc.xyz);
{SOME OTHER OPERATIONS}

ОШИБКА: превышена квота переменной.

Чтобы решить эту проблему, я хочу запустить пакетный процесс, где счет берется из таблицы ab c .xyz, и только 50000 записей обрабатываются в Первая партия и результат сохраняется в таблице временных. На следующей итерации l oop обрабатывает еще 50000 и добавляет их во временную таблицу.

How can this be done in google bigquery?

1 Ответ

1 голос
/ 11 февраля 2020

Ошибка произошла из-за того, что предельный размер для переменной составляет 1 МБ .

Относительно l oop для обработки пакетов. В качестве ссылки вы можете использовать следующее SQL:

DECLARE offset_ INT64 DEFAULT 1; -- OFFSET starts in 1 BASED on ROW NUMBER ()
DECLARE limit_ INT64 DEFAULT 500; -- Size of the chunks to be processed
DECLARE size_ INT64 DEFAULT 7000; -- Size of the data (used for the condition in the WHILE loop)

-- Table to be processed. I'm creating this new temporary table to use it as an example
CREATE TEMPORARY TABLE IF NOT EXISTS data_numbered AS (

  SELECT *, ROW_NUMBER() OVER()  row_number
    FROM (SELECT * FROM `bigquery-public-data.stackoverflow.users` LIMIT 7000)
);

-- WHILE loop
WHILE offset_ < size_ DO

    IF offset_ = 1 THEN -- OPTIONAL, create the temporary table in the first iteration

      CREATE OR REPLACE TEMPORARY TABLE temp_table AS (    
        SELECT * FROM data_numbered
          WHERE row_number BETWEEN offset_ AND offset_ + limit_ - 1 -- Use offset and limit to control the chunks of data 
       );

    ELSE

     -- This is the same query as above.
     -- Each iteration will fill the temporary table
     -- Iteration
     -- 501 - 1000
     -- 1001 - 1500
     -- ...

      INSERT INTO temp_table (
        SELECT * FROM data_numbered WHERE row_number BETWEEN offset_ AND offset_ + limit_ - 1 -- -1 because BETWEEN is inclusive, so it helps to avoid duplicated values in the edges
      );

    END IF;

    -- Adjust the offset_ variable
    SET offset_ = offset_ + limit_;

END WHILE;

Одной из проблем при выполнении этого l oop является то, что вы не можете использовать переменные в предложении LIMIT и OFFSET. Итак, я использовал ROW_NUMBER () для создания столбца, который я мог бы использовать для обработки с предложением WHERE:

 WHERE row_number BETWEEN offset_ AND offset_ + limit_

Если вы хотите узнать больше о ROW_NUMBER (), я рекомендую проверить это SO ответ .

Наконец, если вы хотите использовать этот подход, учтите, что существуют некоторые предостережения, такие как использование сценариев Beta и возможные проблемы с квотами в зависимости от того, как часто вы вставляете данные во временную таблицу. Кроме того, поскольку запрос изменяется в каждой итерации, при первом запуске, и он не кэшируется, bytes_processed будет number_of_iterations * byte_size таблицы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...