BigQuery запрашивает _TABLE_SUFFIX в представлениях с таблицами подстановочных знаков - PullRequest
0 голосов
/ 06 августа 2020

Краткий вопрос:

Как я могу запросить представление, основанное на таблице подстановочных знаков, используя _TABLE_SUFFIX в качестве фильтра, а не столбца ( который будет запрашивать все таблицы)?

например,

 SELECT Name, date, weight 
 FROM `my_view`
 WHERE _TABLE_SUFFIX >= '2020-01-01'

, а не

 SELECT Name, date, weight 
 FROM `my_view`
 WHERE date >= '2020-01-01'

Подробный вопрос:

Допустим, у меня есть таблица bq.school.weights_20191231 со следующим форматом

| Name  | Date       | Weight |
|-------|------------|--------|
| Bob   | 2019-12-31 | 55kg   |
| Alex  | 2019-12-31 | 95kg   |
| ...   | ...        | ..     |
| Sandy | 2019-12-31 | 43kg   |

и таблица bq.school.weights_20200101

| Name  | Date       | Weight |
|-------|------------|--------|
| Bob   | 2020-01-01 | 60kg   |
| Alex  | 2020-01-01 | 100kg  |
| ...   | ...        | ..     |
| Sandy | 2020-01-01 | 40kg   |

И я создать представление на основе базовой таблицы bq.school.weights_* с именем weights_view, например

SELECT Name, Date, Weight 
FROM `bq.school.weights_*`

Как я могу запросить weights_view, используя _TABLE_SUFFIX для фильтрации даты, вместо использования WHERE DATE = "2020-01-01" (который запросит все таблицы)?

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

В дополнение к ответу @ AH вы можете просто сослаться на _TABLE_SUFFIX внутри вашего WHERE , не выбирая его и запросить представление.

Я должен указать, что, согласно документации , псевдостолбец _TABLE_SUFFIX содержит значения, соответствующие подстановочному знаку таблицы. Кроме того, это не обязательно должно быть в предложении SELECT. Ниже приведен пример использования набора данных publi c, он сканирует две таблицы: gsod1940 и gsod1944 ,

#standardSQL
SELECT
  max,
  ROUND((max-32)*5/9,1) celsius,
  mo,
  da,
  year
FROM
  `bigquery-public-data.noaa_gsod.gsod*`
WHERE
  ( _TABLE_SUFFIX = '1940'
    OR _TABLE_SUFFIX = '1944' )
ORDER BY
  max DESC

. Обратите внимание, что в имена таблиц noaa_gsod.gsod , за которым следует год. Также обратите внимание, что псевдостолбец _TABLE_SUFFIX не выбран. Хотя вы можете выбрать, если хотите.

Наконец, я должен подчеркнуть, что существуют ограничения на использование подстановочных знаков с _TABLE_SUFFIX , здесь :

  • Функция таблицы подстановочных знаков не поддерживает представления. Если таблица подстановочных знаков соответствует любому представлению в наборе данных, запрос возвращает ошибку. Это верно независимо от того, содержит ли ваш запрос предложение WHERE в псевдостолбце _TABLE_SUFFIX для фильтрации представления.

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

  • Запросы, содержащие операторы языка манипулирования данными (DML), не могут использовать таблицу подстановочных знаков в качестве цели запроса. Например, таблица с подстановочными знаками может использоваться в предложении FROM запроса UPDATE, но таблица с подстановочными знаками не может использоваться в качестве цели операции UPDATE.

  • Запросы с подстановочными знаками не поддерживаются для таблиц, защищенных ключами шифрования, управляемыми заказчиком (CMEK).

0 голосов
/ 06 августа 2020

Решение

Подобно вопросу BigQuery Date-Partitioned Views , вам необходимо открыть столбец _TABLE_SUFFIX, а затем запросите это, например

SELECT Name, Date, Weight, _TABLE_SUFFIX AS table_suffix_date
FROM `bq.school.weights_*

, а затем запросите представление с помощью

SELECT *
FROM `weights_view`
WHERE table_suffix_date = "20200101"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...