Большой запрос — запланируйте запрос к внешней секционированной таблице с ключевым словом @run_date

#sql #google-cloud-platform #google-bigquery

#sql #google-облачная платформа #google-bigquery

Вопрос:

Поскольку это данные клиента, я заменил в этом сообщении имя проекта и имя набора данных на ******)

Я пытаюсь создать новый запрос расписания в BigQuery на облачной платформе Google Проблема в том, что у меня эта ошибка в редакторе веб-запросов

 Cannot query over table '******.raw_bounce_rate' without a filter over column(s) 'dt' that can be used for partition elimination 
  

Дело в том, что я фильтрую столбец dt.

Вот схема моей внешней секционированной таблицы

 Tracking_Code   STRING  
Pages   STRING  NULLABLE    
Clicks_to_Page  INTEGER 
Path_Lengths    INTEGER 
Visit_Number    INTEGER 
Visitor_ID  STRING  
Mobile_Device_Type  STRING  
All_Visits  INTEGER 
dt  DATE    
  

dt — это поле раздела, и я выбрал опцию «Требовать фильтрации разделов»

Вот упрощенный sql моего запроса

 WITH yesterday_raw_bounce_rate AS (
  SELECT *
  FROM `******.raw_bounce_rate`
  WHERE dt = DATE_SUB(@run_date, INTERVAL 1 DAY)
),
entries_table as (
  SELECT dt,
    ifnull(Tracking_Code, "sans campagne") as tracking_code,
    ifnull(Pages, "page non trackée") as pages,
     Visitor_ID,
     Path_Lengths,
     Clicks_to_Page,
    SUM(all_visits) AS somme_visites
  FROM
    yesterday_raw_bounce_rate
  GROUP BY
    dt,
    Tracking_Code,
    Pages,
    Visitor_ID, 
    Path_Lengths,
    Clicks_to_Page
   HAVING
    somme_visites = 1 and Clicks_to_Page = 1
)
select * from entries_table
  

если я удалю инструкцию

 Clicks_to_Page = 1
  

или, если я заменю

 DATE_SUB(@run_date, INTERVAL 1 DAY)
  

по жестко заданной дате

запрос принимается Big Query, для меня это не имеет смысла

Ответ №1:

В настоящее время здесь остается открытая проблема. Он устраняет ошибку, связанную с использованием фильтра @run_date в фильтре запланированных запросов к секционированным таблицам с требуемым фильтром. Команда инженеров в настоящее время работает над этим, хотя нет ETA.

В запланированном запросе вы можете использовать один из двух обходных путей, используя @run_date .Следующим образом:

Первый вариант,

 DECLARE runDateVariable DATE DEFAULT @run_date;
#your code...
WHERE date = DATE_SUB(runDateVariable, INTERVAL 1 DAY)
  

Второй вариант,

 DECLARE runDateVariable DATE DEFAULT CAST(@run_date AS DATE);
#your code...
WHERE date = DATE_SUB(runDateVariable, INTERVAL 1 DAY)
  

Кроме того, вы также можете использовать CURRENT_DATE() вместо @run_date, как показано ниже:

 DECLARE runDateVariable DATE DEFAULT CURRENT_DATE(); 
#your code...
WHERE date = DATE_SUB(runDateVariable, INTERVAL 1 DAY)
  

Обновить

Я настроил другой запланированный запрос для ежедневного выполнения с таблицей, разделенной по ДАТЕ из вызываемого поля date_formatted , и требуется фильтр разделов. Затем я настроил здесь обратную засыпку, чтобы я мог видеть результат запланированного запроса за предыдущие дни. Ниже приведен код, который я использовал:

 DECLARE runDateVariable DATE DEFAULT @run_date;

SELECT @run_date as run_date, date_formatted, fullvisitorId FROM `project_id.dataset.table_name` WHERE date_formatted > DATE_SUB(runDateVariable, INTERVAL 1 DAY) 
  

Комментарии:

1. на самом деле ничего из этого не работает, в двух первых вариантах все еще есть ошибки «Необъявленные параметры запроса», а последний не работает с обратной засыпкой

2. Вы должны настроить запрос расписания, чтобы переменная @run_date была распознана. Я только что установил uo запланированный запрос и выполнил обратную засыпку, и это сработало. Я добавил код, который использовал в разделе ОБНОВЛЕНИЯ ответа.

3. Вы выбрали опцию «Требовать фильтрации разделов» ?

4. Да, я сделал. Кроме того, схема моей таблицы была: date_formatted as DATE and fullvisitorId as INT64 . Вы пробовали в качестве последнего комментария, который я опубликовал в ответе?

5. Хм, спасибо, но это решение не работает для меня. У меня есть ОБЪЯВИТЬ ВРЕМЕННУЮ МЕТКУ runTimeVariable ПО УМОЛЧАНИЮ @run_time; … ВЫБЕРИТЕ .. ГДЕ insert_timestamp> timestamp_sub(переменная времени выполнения, ИНТЕРВАЛ 7 ДНЕЙ), и я все еще вижу ошибку: невозможно выполнить запрос по таблице… без фильтра по столбцам ‘insert_timestamp’, который можно использовать для удаления разделов