对超过 4000 天数据的 bigquery 表进行分区?

Posted

技术标签:

【中文标题】对超过 4000 天数据的 bigquery 表进行分区?【英文标题】:Partition bigquery table with more than 4000 days of data? 【发布时间】:2019-02-16 22:35:59 【问题描述】:

我在一堆 Avro 文件中有大约 11 年的数据。我想按每一行的日期进行分区,但从文档看来我不能,因为有太多不同的日期?

集群对此有帮助吗?我的数据的自然集群键仍然有一些数据超过 4000 天。

【问题讨论】:

你每天有多少行?一种选择是按周或月进行分区,并按日期或时间戳进行集群。 我是年表的粉丝,如果需要的话,您可以使用 * 查询所有这些表 @ElliottBrossard 我正在使用只能使用“天”的“时间戳列上的分区”功能。加载数据后,我最多只有 3661 天,所以我猜我有一年的时间来看看限制是否会增加。我每个月只有大约 20-2500 万行,但这项工作的一部分是能够添加约 10 倍的数据。 @FelipeHoffa 旧的(非 BigQuery)系统做到了这一点,它不如拥有“内置”分区那么方便。我在 ClickHouse 中有相同的数据,并且只有一个表非常适合非自动查询。 我的一些用例是只为一组特定的 ID 获取一两天的数据,所以目前我在一天(在一个大表中)进行分区并在其他 ID 列上进行集群。乍一看,它似乎运行良好,除了在明年的某个时候用完分区。 【参考方案1】:

我看到了两个解决方案:

1) 根据您的列将表分片(每年)与时间分区相结合。我自己从未测试过,但它应该可以工作,因为每个分片都被视为 BQ 中的一个新表。 这样您就可以轻松地使用一个通配符/变量来处理分片和分区。

2) 一个好的解决方法是创建一个额外的列,其中包含应分区的日期字段。 对于超过 9 年的每个数据条目(例如:DATE_DIFF(current_date(), DATE('2009-01-01'), YEAR)),将您的日期格式化为特定月份的 1 号。

这样您就可以再创建 29 年的数据。

请注意,您不能使用日期过滤器基于该列进行过滤,例如在 DataStudio 中。但是对于查询它是有效的。

最好的托马斯

【讨论】:

【参考方案2】:

目前根据文档集群仅支持分区表。将来它可能会支持非分区表。

您可以将每年的旧数据放在单个分区中。 您需要在表中添加额外的列以对其进行分区。

假设,2011 年的所有数据都将转到分区 20110101。 对于较新的数据(2019 年),您可以为每个日期设置单独的分区。

这不是一个干净的问题解决方案,但使用它可以通过使用集群进一步优化以提供最小的表扫描。

【讨论】:

【参考方案3】:

每天 4,000 个分区只是 10 多年的数据。如果您需要一个包含 10 年以上数据的“表格”,一种解决方法是使用视图:

    将表拆分为几十年,确保所有表都在同一字段上分区并具有相同的架构 在 BigQuery 视图中将表合并在一起

这会产生一个包含 4,000 多个分区的视图,业务用户可以查询这些分区,而无需担心他们需要使用哪个版本的表或将这些表联合起来。

【讨论】:

【参考方案4】:

按周/月/年而不是按天进行分区可能更有意义 - 取决于您每天拥有多少数据。

在这种情况下,请参阅:

Partition by week/year/month to get over the partition limit?

【讨论】:

以上是关于对超过 4000 天数据的 bigquery 表进行分区?的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中恢复过期的 Firebase 表并将数据保存时间超过 60 天

将超过 7 天的数据插入分区 BigQuery 表

在 BigQuery 之上设计 API

BigQuery:超过对列分区表的分区修改次数的配额

数据流 - 对 BigQuery 的窗口写入?

如何对一系列数据进行分组以在 GOOGLE BigQuery 中创建一个类别