Python BigQuery - 如果行是新的并忽略重复的行,如何附加到表中

Posted

技术标签:

【中文标题】Python BigQuery - 如果行是新的并忽略重复的行,如何附加到表中【英文标题】:Python BigQuery - How to append to a table if the rows are new and ignore rows that are duplicates 【发布时间】:2020-03-30 15:53:58 【问题描述】:

我正在使用一个调度程序,它每 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

是否可以在每次运行此查询时仅追加新行,并且如果前一个查询中有重复项以忽略这些行。

更新: 我找到了合并语句,如果我的逻辑是正确的,如果它们不匹配,它将使查询能够添加新行。

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】:

您得到的错误确实是由于每天每个表的数据和元数据更新过多造成的,因此缩小此更新数量应该可以解决您的问题。

您在 [1] 中有关于合并语句的信息,在 [2] 中有一些合并示例。 关于您的查询,合并语句似乎正确编写,但没有给出您想要的结果。有用吗?

也许您可以尝试将“ON Target = Query”语句更改为“ON Target.job_id = Query.job_id”,据我了解,您正在附加有关查询的信息,因此您要比较的是作业 ID,而不是全部表。

此外,如果您说查询每 5 分钟触发一次,您可以将您在源上选择的查询窗口降低:“AND creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)”到更低的窗口超过 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

【讨论】:

以上是关于Python BigQuery - 如果行是新的并忽略重复的行,如何附加到表中的主要内容,如果未能解决你的问题,请参考以下文章

如何正确迭代所有 BigQuery 结果行?

将 BigQuery 查询结果行写入 csv 文件时,某些记录重复

如果行中不存在所有值,则插入记录[重复]

如何在 BigQuery 的新 SQL 查询中连接/使用已保存的查询

如果行中的指定值与条件匹配,则从 CSV 返回一行

BigQuery 行级安全权限