BigQuery - 使用分区创建视图,但基表没有

Posted

技术标签:

【中文标题】BigQuery - 使用分区创建视图,但基表没有【英文标题】:BigQuery - Create view with Partition but base table doesn't have 【发布时间】:2021-01-09 03:07:09 【问题描述】:

这听起来可能很疯狂,但我想实现一些东西,比如有一个带有分区的视图。

背景:

我有一个表,其列上的日期分区非常大。我们每隔 2 分钟对这个表进行一次数据摄取。所有数据加载都是仅附加的。 Ever load 将插入 10k+ 行。一段时间后,我们遇到了分区限制问题。

message: "Quota exceeded: Your table exceeded quota for Number of partition modifications to a column partitioned table. For more information, see https://cloud.google.com/bigquery/troubleshooting-errors"

根本原因:(来自 GCP 支持团队)

引擎盖下的根本原因是由于您的分区表 有非常精细的分区,例如按分钟、小时或日期, 当加载的数据覆盖大范围的分区周期时, 被修改的分区数将高于 4000。根据 内部文档,建议遇到此问题的用户 考虑对实例更改进行粒度较小的分区的问题 基于日期/小时/分钟的分区表到基于周的分区表 桌子。或者将负载拆分为多个,从而限制 数据范围以覆盖较少数量的受影响分区。 这是我现在能得到的最好的建议。

所以我打算将这个表保持为未分区并创建一个视图(我们需要一个视图来消除重复项)并且它应该有分区。这可能吗?或任何其他替代解决方案?

【问题讨论】:

【参考方案1】:

您不能对视图进行分区,它不是物理实体化的。一天的分区可以限制为 4000 个限制,一年可以吗?那么你可以使用整数分区:

create or replace table BI.test 
PARTITION BY RANGE_BUCKET(Year, GENERATE_ARRAY(2000, 3000, 1)) as
select 2000 as Year, 1 as value
union all
select 2001 as Year, 1 as value
union all
select 2002 as Year, 1 as value

或者,我使用月 (YYYYMM) 或周 (YYYYWW) 来进行整数分区,这样可以得到大约 40 年:

RANGE_BUCKET(monthasintegerfield, GENERATE_ARRAY(201612, 205712, 1)) 

【讨论】:

以上是关于BigQuery - 使用分区创建视图,但基表没有的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中创建动态视图

为啥 Google BigQuery 在使用视图时没有正确使用分区日期

选择时如何从配置单元视图中丢弃分区列?

BigQuery 日期分区视图

在 bigquery 中查询从分区表创建的视图

有没有办法在 BigQuery 表上创建自定义日分区?