Python BigQuery - Как добавить таблицу, если строки новые и игнорировать строки, которые являются дубликатами - PullRequest
0 голосов
/ 30 марта 2020

Я использую планировщик, который запускает запрос каждые 5 минут и добавляется к таблице назначения, которая сработала в первый раз, но вскоре после того, как я получил сообщение об ошибке: google.api_core.exceptions.Forbidden: 403 Quota exceeded: Your table exceeded quota for imports or query appends per table.

 SELECT
    job_id,
    creation_time,
    query,
    total_bytes_processed
    FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
    WHERE project_id ='project-name'
    AND creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
    AND CURRENT_TIMESTAMP()
    ORDER BY creation_time DESC
    LIMIT 100

Это возможно, чтобы при каждом запуске этого запроса добавлялись только новые строки, а при наличии дубликатов из предыдущего запроса эти строки игнорировались.

Обновление: я нашел оператор слияния, который позволит запросу добавлять новые строки, если они не совпадают, если мои логики c верны.

MERGE project-id.dataset.table as Target
USING 
(
    SELECT
    job_id,
    creation_time,
    query,
    total_bytes_processed
    FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
    WHERE project_id ='project-id-name'
    AND creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
    AND CURRENT_TIMESTAMP()
    ORDER BY creation_time DESC
    LIMIT 100
)  Query
ON Target = Query
WHEN NOT MATCHED THEN
INSERT (ROW) 

1 Ответ

0 голосов
/ 08 апреля 2020

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

У вас есть информация об операторе слияния в [1] и некоторые примеры слияния в [2]. Что касается вашего запроса, оператор слияния выглядит правильно, но не дает желаемого результата. Работает ли это?

Может быть, вы можете попробовать изменить оператор "ON Target = Query" на "ON Target.job_id = Query.job_id", в моем понимании вы добавляете информацию о запросах, так что идентификатор задания - это то, что вы сравниваете, а не всю таблицу.

Кроме того, если вы говорите, что запрос запускается каждые 5 минут, вы можете уменьшить окно запросов, которые вы выбираете для источника: "AND creation_time BETWEEN TIMESTAMP_SUB (CURRENT_TIMESTAMP (), ИНТЕРВАЛ 1 ДЕНЬ) "к окну, меньшему чем 1-дневный интервал.

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

[1] https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#merge_statement

[2] https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#merge_examples

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