何时在 BigQuery 中使用分区
Posted
技术标签:
【中文标题】何时在 BigQuery 中使用分区【英文标题】:When to use partitioning in BigQuery 【发布时间】:2019-12-13 07:59:06 【问题描述】:我想利用您在 BigQuery 方面的经验来决定我的数据的最佳结构, 我在关系数据库尤其是 Oracle DB 方面有 5 年的经验,我熟悉在关系数据库中使用构建数据仓库的最佳实践,但是在云解决方案方面,我还是新手
我的问题是关于 BigQuery 中的分区表, 据我所知,BigQuery 中只有一天的分区,
所以我的很多数据每天的行数都很低(最大在 1K 到 12K 之间),但它们包含很长一段时间的数据,所以根据日期对表进行分区是个好主意? 如果我将数据划分为每年的表,并创建一个视图来表示所有表,这会有所帮助吗?或者 BigQuery 上还有其他解决方案吗? 根据您的经验,如果在 BQ 中使用分区是有效的,那么每日数据应该有多大?
如果您有任何关于将 BQ 用于 DWH 的最佳实践的参考资料或书籍,请提供给我。
【问题讨论】:
【参考方案1】:所以我的很多数据每天的行数都很低(最大在 1K 到 12K 之间),但它们包含很长一段时间的数据,所以根据日期对表进行分区是个好主意?
这取决于您要使用的查询涵盖的时间范围。
案例 A.
例如,如果查询的最长持续时间是 1 周,那么划分为每日分区在速度和成本方面可能非常有利,因为引擎不需要扫描整个表。它将仅选择每日 7 个分区。 示例:对于公共数据集 bigquery-public-data.samples.github_timeline
,由于表扫描,覆盖 1 天的查询导致数据使用量约为数百兆字节。使用类似的每日分区表可将 1 天查询产生的数据使用量减少到约 10 MB。
案例 B. 另一方面,如果最频繁运行的查询涵盖一到两年的时间范围(例如,按时间计算表中的整个数据跨度),那么每日分区并没有多大帮助,引擎需要处理几乎所有反正桌子。因此,每天进行分区将无济于事。如果每日数据量小于最小集群大小,则集群可能会对数据使用产生不利影响,因为引擎最终会处理更多磁盘空间。
如果将类似的注意事项与实际最小集群大小和最小分区大小(如果有)信息一起记录下来,将会很有帮助。如果这些数字是动态的,那么预期的范围是多少。
有用的答案:123
【讨论】:
实际上大多数过滤器的时间段在 3 个月到 2 年之间,有些表每天只包含数百行,这就是为什么我不确定是否使用分区导致通常,糟糕的分区只会让事情变得更糟,而不是帮助。【参考方案2】:Bigquery 中有两种分区模式
-
按日期分区
按整数范围划分
两者都可以容纳 4000 个分区,因此请明智地选择选项。
如果您的日期范围大于或预计大于 4000 天,您可能希望按周/月进行分区。 对于整数范围,您可以使用 unixtime 作为整数,并且范围可以跨越 10 年以上,并且每个范围都将大于 24 小时。是数学。
为分区表选择特定的列命名约定,例如:partitioned
或 timestamp
。
ps。您可以应用 4 个其他列来进一步聚类您的表。
一个实际的例子是:
按时间戳分区,按国家/地区分组 按周时间戳分区,按天列聚集 按整数范围列分区,例如:unix 时间,按事件、类别、语言聚类【讨论】:
所以可以按每周或每月时间戳进行分区吗?还是我必须创建一个新列,其中包含周值? @Joe 您需要为其创建一个新列。 这会有帮助吗?因为如果我创建了一份报告,并且我想让客户能够选择任何日期范围,而不仅仅是星期,那么过滤器将位于日期字段 如果你不符合 4000 个分区的限制,你只需要做 WEEKly 日期。 实际上大多数过滤器的期限在 6 个月到 2 年之间,有些表每天只包含数百到数千行,这就是为什么我不确定是否要使用是否每天进行分区(如果这样可以节省一些成本或提高性能)通常导致错误的分区会使事情变得更糟而不是帮助以上是关于何时在 BigQuery 中使用分区的主要内容,如果未能解决你的问题,请参考以下文章