Bigquery: фильтр по _PARTITIONTIME не распространяется на левое соединение - PullRequest
1 голос
/ 31 мая 2019

У меня есть 2 многораздельных таблицы:

Таблица 1:


| user_id | request_id |


Таблица 2:


| ip | user_id | request_id |


Я хочу получить для всех ips из partition_table2: - количество пользователей (из partition_table1) - запросы пользователей (из partition_table1) - запросы пользователей (из partition_table2)для пользователей (из partition_table1)

Информация: Ip связан с request_id из таблицы 1, поскольку один user_id может иметь более одного ip.

Проблема: Когда я фильтрую по _PARTITIONTIME в основном запросеон не распространяется на запрос из WITH, когда я выполняю LEFT JOIN, но фильтр по _PARTITIONTIME распространяется, когда я выполняю INNER JOIN.

Кажется, что удаление разделов не работает: https://cloud.google.com/bigquery/docs/querying-partitioned-tables для LEFTJOIN

Мой запрос:

WITH
  users_info AS (
  SELECT
    t2.ip,
    t1.user_id,
    COUNT(DISTINCT t1.request_id) AS user_requests,
    t1._PARTITIONTIME AS date
  FROM partitioned_table1 t1
  INNER JOIN partition_table2 t2
    ON t1.request_id = t2.request_id
    AND t1._PARTITIONTIME = t2._PARTITIONTIME
  GROUP BY t2.ip, t1.user_id, t1._PARTITIONTIME
  )
SELECT
  t2.ip,
  COUNT(DISTINCT m.user_id) AS users,
  COUNT(DISTINCT t2.request_id) AS t2_users_requests,
  SUM(m.user_requests) AS t1_users_requests
FROM partition_table2 t2
LEFT JOIN/INNER JOIN users_info m
  ON t2.ip=m.ip
  AND t2.user_id=m.user_id
  AND m.date = t2._PARTITIONTIME
WHERE DATE(t2._PARTITIONTIME) = "2019-05-20" 
GROUP BY t2.ip

Если я выполняю INNER JOIN, этот запрос обрабатывает ~ 4 ГБ, но с LEFT JOIN обрабатывает ~ 3 ТБ

Я сделал что-то не такили это поведение ожидается?


РЕДАКТИРОВАТЬ

Мне нужно тего запрос, чтобы создать вид.Условие (DATE (t2._PARTITIONTIME) = "2019-05-20") из вышеприведенного запроса, которое я буду использовать для фильтрации VIEW, когда сделаю запрос.

1 Ответ

0 голосов
/ 31 мая 2019

Столбцы с правой стороны LEFT OUTER JOIN потенциально могут иметь значение NULL, поэтому да, BigQuery на самом деле нужно выполнить соединение, чтобы выяснить результаты, а не фильтровать разделы заранее.Если вам не нужно это поведение, используйте подзапрос, в котором вы фильтруете _PARTITIONTIME до объединения.

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