按日期对表进行分段的 BigQuery 最佳做法

Posted

技术标签:

【中文标题】按日期对表进行分段的 BigQuery 最佳做法【英文标题】:BigQuery best practice for segmenting tables by dates 【发布时间】:2013-12-12 12:48:21 【问题描述】:

我不熟悉列式数据库概念,尤其是 BigQuery。我注意到,为了性能和成本效率,建议不仅在逻辑上跨表拆分数据,而且还按时间拆分数据。

例如 - 虽然我需要一个表来存储我的日志(1 个称为“日志”的逻辑表),但实际上认为在不同时期有一个单独的表是一种好习惯,例如“logs_2012”、“logs_2013” "等...甚至是"logs_2013_01"、"logs_2013_02"等...

我的问题: 1) 这实际上是最佳实践吗? 2) 最好在哪里画线 - 年表?月表?每日餐桌?你明白了... 3) 在通过查询检索数据方面 - 最好的方法是什么?我应该使用 UNION 选项动态构建查询吗?如果我将所有日志都放在一个表中 - 我自然会使用 where 子句来获取所需时间范围内的数据,但是将数据分布在多个表中会很奇怪。我来自关系数据库的世界(如果到目前为止还不是很明显的话),我正试图尽可能顺利地实现飞跃...... 4) 使用分布式方法(不同时期的不同表)仍然会引发以下问题:在查询数据本身之前 - 我希望能够确定特定日志类型 - 可用范围是多少查询。例如 - 对于特定机器,我想首先向我的用户展示他们可用日志的相关范围,并让他们选择该范围内的特定时间段以获得洞察力。问题是 - 当我的数据分布在我不知道哪些表可用的多个表(每个表为一段时间)上时,我如何构建这样的查询?当我不知道存在哪些表时,如何构造查询?当该表实际上不存在或最糟糕的情况下,我可能会尝试访问表“logs_2012_12” - 我不知道哪些表是相关的并且可用于我的查询。

希望我的问题有意义...

阿米特

【问题讨论】:

【参考方案1】:

表格命名

对于每日餐桌,建议的餐桌名称模式是您餐桌的具体名称 + 日期,如“20131225”。例如,“logs20131225”或“logs_20131225”。

理想的聚合:日、月、年?

这个问题的答案将取决于您的数据和您的查询。

您通常会查询一两天的数据吗?然后有每日表,您的成本会低得多,因为您只查询您需要的数据。 您通常会查询所有数据吗?然后将所有数据放在一张表中。随着要查询的表数量增加,一个查询中包含多个表可能会变慢。 如果有疑问,两者都做!你可以有每日、每月、每年的表格。在执行仅针对预期数据的查询时,您可以节省大量存储成本。

工会

随意做工会。

请记住,每个查询有 1000 个表的限制。这意味着如果您有每日表,您将无法查询 3 年的数据 (3*365 > 1000)。 请记住,BigQuery 中的联合不使用 UNION 关键字,而是其他数据库用于连接的“,”。 BigQuery 中的连接可以使用显式 SQL 关键字 JOIN(或 JOIN EACH 表示非常大的连接)来完成。

表发现

API:tables.list 将通过 API 列出数据集中的所有表。 SQL:要查询 SQL 中的表列表...请继续关注。

【讨论】:

【参考方案2】:

2016 年新答案:分区

现在您可以将所有内容放在一个表中,BigQuery 将仅分析所需日期中包含的数据 - 如果您设置了新的分区表:

https://cloud.google.com/bigquery/docs/creating-partitioned-tables

【讨论】:

以上是关于按日期对表进行分段的 BigQuery 最佳做法的主要内容,如果未能解决你的问题,请参考以下文章

以增量方式将数据从 GCP Datastore 移动到 BigQuery 的最佳做法

BigQuery 表设计最佳实践:日期分区和分片的组合?

如何按日期时间列对表进行分区?

如何在 BigQuery SQL 中为与按日期排序的主 ID 关联的子 ID 编号?

Big Query 中的表未分区

处理 BigQuery 中未嵌套记录导致的重复行的最佳做法?