具有大量表的 bigquery

Posted

技术标签:

【中文标题】具有大量表的 bigquery【英文标题】:bigquery with a large number of tables 【发布时间】:2016-12-11 13:04:55 【问题描述】:

我知道已经有关于桌数限制的问题,但它含糊不清...... 在一个数据集中,我想创建大约 1-2 百万个表。发生这种情况是因为我想将我的用户活动表拆分为较小的表;为每个用户一个表。随着时间的推移,这个数字将继续增长。 据我了解,BigQuery 的观点不会有任何问题……但我担心我将无法从浏览器(https://bigquery.cloud.google.com/queries/appname)访问(列出)这些数据集;因为表格不是按时间分组的(比如有时间范围的表格),它们都被列在一个无休止的滚动中(可能会阻塞浏览器)

感谢您的任何建议

【问题讨论】:

那你有什么问题? 问题是浏览器在列出数据集中的所有表时会被阻止...因此我无法轻松探索我的数据集(并查询它们) 拥有这么多表有什么好处?特别是考虑到 bigquery 擅长在单个表中处理非常大的数据量。 @matt_black - 潜在的好处是查询成本。即使 BigQuery 是列式的,并且您为查询的列付费。它仍然会花费你所有的行,所以如果你能以某种方式减少查询的行数 - 你可以节省 $$ - 分区/分片是这样做的方法 @MikhailBerlyant 是的,但我怀疑拥有数百万张桌子是一个很好的成本解决方案。查询数百万行仍然很便宜。您需要在给定不同配置的情况下试验速度和成本,以确保任何节省和使用来自更传统数据库设置的经验法则可能是非常错误的。 【参考方案1】:

...问题是浏览器在列出所有内容时会被阻止 数据集中的表

您可以使用“?minimal”参数将加载操作限制为每个项目 30,000 个表,因此不会阻止浏览器。例如:

https://bigquery.cloud.google.com/queries/<your_project_name>?minimal.   

查看更多关于Display limits

因此,我无法轻松探索我的数据集(并查询它们)

如果您计划在同一数据集中拥有 2+ 百万个表,即使 Web UI 将它们显示给您而不会被阻止 - 我真的怀疑您是否能够以某种方式合理地直观地探索它们。太多的东西不能“吞下” 顺便说一句,这不仅是人类特有的问题——即使以编程方式查询这样的“长”表列表也可能会出现问题。查看更多关于Using meta-tables

因为表格不是按时间分组的(就像带有时间范围的表格一样)并且它们都被列在一个无限滚动中(可能会阻塞浏览器)

没错,在 BigQuery Web UI 中,只有遵循 table_preffixYYYYMMDD 模式的表才会被分组。即使您将 userID 命名空间映射到 YYYYMMDD 值,您仍然会很不走运,因为您的组仍将包含数百万个表。

感谢您的建议

BigQuery 支持Partitioned Tables,它允许在同一个表中拥有多个分区。不幸的是,截至今天,仅支持日期分区表,但据我所知,BigQuery 团队计划按任意列添加分区。 这可能适合您想要的设计,除非对列基数有限制。 同时,如果您愿意,您可以通过将用户 ID 映射到 YYYYMMDD(~9999*12*30 >> 3+ 百万用户)来尝试使用日期分区表功能来应用您的设计

我的建议:

    按照我在前面(上)部分中的建议使用分区表进行游戏/实验 在我看来,将 BigQuery 中的表分片(拆分)为数百万个表听起来非常不切实际。你应该重新审视你的设计。您试图通过这种分片解决什么问题?尝试关注这一点,如果需要 - 在此处发布特定问题!

【讨论】:

嗨@mikhail,你有一些散列分割的经验吗? YYYYMMDD?这看起来是个好主意,我也想过,但我有点害怕 :) ( ctrl.alt.d at gmail dot com )【参考方案2】:

您可以使用Google cloud sdk client 作为替代解决方案。

您可以阅读此 bq 命令行工具 here 的文档。

例如:bq ls [project_id:][dataset_id] 列出所有表。

注意:每个查询的最大表数限制为 1000 个。Refer

【讨论】:

以上是关于具有大量表的 bigquery的主要内容,如果未能解决你的问题,请参考以下文章

在 postgres 中更新具有大量删除的表的主键序列

如何合并具有不同列号的两个表,同时删除具有大量列的表的重复项

更快的 Laravel 迁移,用于测试具有大量表的项目

尝试从 golang 广告读取/运行对 bigquery 的查询被拒绝访问:BigQuery BigQuery:未找到具有 Google Drive 范围的 OAuth 令牌

处理具有数百万条记录更新和大量读数的 MySQL 表的最佳方法

我应该合并事实表的列以使其更窄,还是应该通过大量列使其对用户更友好?