Фильтрация по кластеризованным полям с использованием запроса дополнительного выбора - PullRequest
0 голосов
/ 04 апреля 2019

С помощью Google Bigquery я запрашиваю кластеризованную таблицу, применяя фильтр к полю кластеризации projectId, например:

WITH userProjects AS (

    SELECT 
        projectsArray 
    FROM 
        projectsPerUser 
    WHERE 
        userId = "eben@somewhere.com"
)

SELECT 
    userProperty
FROM 
    `mydata.mydataset.mytable`
WHERE 
    --projectId IN UNNEST((SELECT projectsArray FROM userProjects))
    projectId IN ("mydata", "anotherproject")
    AND _PARTITIONTIME >= "2019-03-20"

Кластеризация применяется правильно в приведенном выше фрагменте кода, но когда яиспользуйте закомментированную строку --projectId IN UNNEST((SELECT projectsArray FROM userProjects)), кластеризация не применяется.

Я также пытался обернуть его в UDF, что также не работает:

CREATE TEMP FUNCTION storedValue(item ARRAY<STRING>) AS (
  item
);

...

WHERE projectId IN UNNEST(storedValue((SELECT projectsListArray FROM projectsList)))

Как я понимаю из этого, путь выполнения для запросов на выборочный выборотличается от простой фильтрации по скаляру или массиву напрямую.

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

В итоге:

  1. WHERE projectId IN ("mydata", "anotherproject") [OK]
  2. WHERE projectId IN UNNEST((SELECT projectsArray FROM userProjects)) [Not OK]
  3. WHERE projectId IN UNNEST(storedValue((SELECT projectsListArray FROM projectsList))) [Not OK]

Есть идеи?

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

FWIW, кластеризация у меня хорошо работает с динамическими фильтрами:

SELECT title, SUM(views) views
FROM `fh-bigquery.wikipedia_v3.pageviews_2019`
WHERE DATE(TIMESTAMP_TRUNC(datehour, DAY)) = '2019-01-01'
AND wiki='en'
AND title IN ('Dogfight_(disambiguation)','Dogfight','Dogfight_(film)')
GROUP BY 1

1.8 sec elapsed, 364 MB processed

если вместо этого я

AND title IN (
  SELECT DISTINCT prev 
  FROM `fh-bigquery.wikipedia_vt.clickstream_materialized` 
  WHERE date='2019-01-01' AND prev LIKE 'Dogfight%'
  ORDER BY 1  LIMIT 3)

2.9 sec elapsed, 513.8 MB processed

Если я перейду к v2 (не в кластере) вместо v3:

FROM `fh-bigquery.wikipedia_v2.pageviews_2019`

2.6 sec elapsed, 9.6 GB processed

Я не уверен, что происходит в ваших таблицах, но, возможно, будет интересно вернуться к нему.

1 голос
/ 04 апреля 2019

Я предлагаю переписать ваш запрос, чтобы ваш вложенный SELECT был временной таблицей (что вы уже сделали), а затем выполнить требуемую фильтрацию, используя INNER JOIN, а не набор тестов членства, чтобы ваш запросстать примерно так:

WITH userProjects AS (

    SELECT 
        projectsArray 
    FROM 
        projectsPerUser 
    WHERE 
        userId = "eben@somewhere.com"
)

SELECT 
    userProperty
FROM 
    `mydata.mydataset.mytable` as a
    JOIN
    userProjects as b
    ON a.projectId = b.projectsArray
WHERE 
    AND _PARTITIONTIME >= "2019-03-20"

Я полагаю, что это приведет к запросу, который не сканирует полный раздел, если это поле кластеризовано.

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