【发布时间】:2019-08-13 17:10:17
【问题描述】:
我正在为我的 Bigtable 寻找一个最佳方案,以通过指定年份(或完整日期)、国家和(或)城市来满足查询数据的要求。我曾考虑将我的行键命名为2019.us.NYC,然后通过前缀查询它,但这是一个坏主意,因为它只会将我的所有数据存储在一个节点上,直到 2020 年到来,而不是共享给其他节点。有任何想法吗?也许有人已经有了这样的案例?这里的瓶颈是每秒将有大约 50 000 000 条新行。
编辑:也许使用 BigQuery 更好?
【问题讨论】:
-
回答您的最后一个问题,BigQuery 对流式插入 (cloud.google.com/bigquery/quotas#streaming_inserts) 有配额:每个项目每秒 100'000 行,因此 Bigtable 可能是您想要使用的数据库。您能否阐明您的数据查询要求?在您的问题中,这些是排他性的 还是,或者您可以查询完整日期和国家/地区吗?您需要低延迟来进行数据访问吗?还请提供您要存储的数据示例,以帮助您设计 Bigtable 架构。
-
@norbjd 首先感谢您的帮助。要求是至少能够按指定年份和国家/地区查询数据。另外可以指定月份、日期和城市名称。低延迟非常重要。我计划存储包含我需要的所有内容的简单 json 值,但如果我能够将数据直接存储到表族中会更好。
-
@norbjd 在 MySQL 表中,这个查询看起来像这样:
SELECT * FROM my_table WHERE country = 'us' AND city = 'new_york' AND date = '2019-08-12' ORDER BY id DESC LIMIT 100或:SELECT * FROM my_table WHERE country = 'de' AND city = 'berlin' AND YEAR(date) = '2017' ORDER BY id DESC LIMIT 100 -
BigTable 强制使用单个键。您希望最后有一个组合键和另一个值。因此,可能类似于“2019.us.Nyc.{guid}”,其中 guid 是您为每个值创建的一些唯一标识符。然后,您可以使用一个简单的范围运算符,如果您想要整个组,它应该能够尽可能快。然后您可以在 '2019.us.nyc.{empty-guid}' 和 '2019.us 之间进行。 nyc.{max-guid}' 查找所有数据,同时仍然具有唯一行。查看范围过滤器cloud.google.com/bigquery/external-data-bigtable
-
回答上面的评论,使用
2019.us.Nyc.{guid}作为rowkey会导致Bigtable节点热点(在同一个节点上连续写入),因为行键将是连续的,正如@Mmh1正确理解的那样并在他的问题中写道。此外,如果需要低延迟读取,从 Bigquery 中查询数据以访问 Bigtable 数据可能不是解决方案。