BigQuery 重复数据删除和分区表

Posted

技术标签:

【中文标题】BigQuery 重复数据删除和分区表【英文标题】:BigQuery deduplication and partitioned table 【发布时间】:2017-07-21 11:05:30 【问题描述】:

我想在 BigQuery 中创建一个允许执行以下操作的视图:

记录的去重 将 _PARTITIONTIME 公开为用于过滤的列,以允许分区修剪

我知道执行重复数据删除的建议查询是:

SELECT
  * EXCEPT(row_number)
  FROM (
SELECT *
    ,ROW_NUMBER()
          OVER (PARTITION BY fct.KeyColumn ORDER BY fct.CreatedDatetime DESC) row_number
FROM `my-project.my_dataset.fact_table` fct)
WHERE
  row_number = 1

关于如何查询分区表的建议方法是:

SELECT
  *
FROM
  `my-project.my_dataset.fact_table`
WHERE
  _PARTITIONTIME BETWEEN TIMESTAMP('2016-01-01')
  AND TIMESTAMP('2016-01-02');

如何将这两者结合起来以提供一个经过重复数据删除的 BigQuery 视图,并提供一个列以允许在视图的 where 子句中使用 _PARTITIONTIME。如果使用子选择等,我了解了分区修剪的限制,这就是为什么我想知道这是否可能。

为了给您一些背景信息,此视图位于正在流式传输到的表的顶部,因此重复数据删除必须即时进行。

【问题讨论】:

【参考方案1】:

您需要让视图每天返回最新的行,以启用对分区时间的过滤。应该是这样的:

#standardSQL
SELECT day, latest_row.*
FROM (
  SELECT
    _PARTITIONTIME AS day,
    ARRAY_AGG(fct ORDER BY fct.CreatedDatetime DESC LIMIT 1)[OFFSET(0)] AS latest_row
  FROM `my-project.my_dataset.fact_table` AS fct
  GROUP BY day, KeyColumn
);

在外部查询中,latest_row.* 还应该包含KeyColumn

【讨论】:

那里有一些很棒的魔法!还没有考虑过使用 ARRAY 函数。仅出于我的理解,这种重复数据删除方式的性能是否与按语句分区一样好,并且在外部查询(或使用此查询查看)中应用过滤器时,这是否只会扫描相关分区? 两者都是 :) 请仔细检查我的工作。创建视图后,在其上编写一个查询以在当天进行过滤。当您单击绿色对勾打开编辑器右下角的验证器时,您应该会看到扫描的正确字节数。 像魅力一样工作! 我实现了一个类似的解决方案,发现虽然扫描的字节数相当于查询底层表,但性能/执行时间明显变慢。你有过同样的经历吗?有什么建议吗? 请提交一个尽可能详细的单独问题。

以上是关于BigQuery 重复数据删除和分区表的主要内容,如果未能解决你的问题,请参考以下文章

如何禁止向BigQuery加载重复的行?

Bigquery:分区数据超过 2000 限制(更新:现在 4000 限制)[重复]

如何为 Google Bigquery 表创建季度分区 [重复]

如何过滤 bigquery 的重复表行数据以删除重复行?

Bigquery 重复数据删除查询无法正常工作

两列上的 BigQuery 重复数据删除作为唯一键