Курсоры в BigQuery - PullRequest
       0

Курсоры в BigQuery

0 голосов
/ 27 января 2020

Есть ли способ в BigQuery Scripting объявить курсор, как в MySql Scripting. Мне нужно запланировать периодический запуск сценария. Есть лог c, где Шаг 1: Извлечь все имена предприятий (вывод нескольких строк) Шаг 2. Для каждого предприятия go в таблицу предприятия и выполнить несколько запросов на обновление.

MySql Имеет курсор, который помогает с такими функциями в сценариях. Я имел в виду страницу сценариев BigQuery, но не смог найти ничего подобного. https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting#set

Есть ли эквивалентный курсор в BigQuery?

Есть ли еще какой-нибудь способ, которым я могу воспользоваться, что я хочу сравнить с тем, что доступно в скриптах BigQuery?

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

В BigQuery я использовал следующую имитацию зацикливания курсора

BEGIN

DECLARE x INT64 DEFAULT 1;
DECLARE z INT64 DEFAULT 0;

CREATE TEMP TABLE temp_country AS
SELECT country, RANK() OVER(ORDER BY country) rownum
FROM (SELECT DISTINCT country
FROM `bigquery-public-data.faa.us_airports`)
order by country;

SET z= (SELECT COUNT(*) FROM temp_country);

WHILE x<=z DO

  SELECT country 
  FROM temp_country
  WHERE rownum = x;

SET x=x+1;

END WHILE;

END;

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

В BigQuery нет курсора SQL, но есть некоторые альтернативы, которые вы можете использовать вместо этого, в качестве первого варианта вы можете использовать временную таблицу , которая будет существовать в течение всего времени существования текущий скрипт. Таблицы, созданные в процедуре, по-прежнему доступны после завершения вызова процедуры до завершения основного сценария.

CREATE TEMP TABLE light AS
SELECT * FROM `bigquery-public-data.noaa_lightning.lightning_2019` LIMIT 1000;

SELECT * FROM light;

Кроме того, существует оператор WITH ( docs ) для ссылки к SELECT (s), с ограничением на то, что вы должны выполнять операции внутри одного и того же предложения, что может быть, например, вызовом пользовательской функции ( UDF ) или хранимой процедуры ( SP ) для необходимых операций обновления.

WITH data AS (
  SELECT * FROM `bigquery-public-data.noaa_lightning.lightning_2019` LIMIT 1000
)
SELECT * FROM data;

Наконец, вы можете использовать массив , чтобы получить все имена предприятий, а затем в пределах al oop выполнить необходимые операции обновления (также вы можете вызвать UDF или SP).

-- Sample from the official documentation for the use of an array
-- Declare a variable to hold names as an array.
DECLARE top_names ARRAY<STRING>;
-- Build an array of the top 100 names from the year 2017.
SET top_names = (
  SELECT ARRAY_AGG(name ORDER BY number DESC LIMIT 100)
  FROM `bigquery-public-data`.usa_names.usa_1910_current
  WHERE year = 2017
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...