如何在BigTable中撰写行键?

时间:2017-09-21 15:37:14

标签: google-cloud-bigtable

https://cloud.google.com/bigtable/docs/schema-design中,清楚地描述了如何选择表格的行键。但我找不到有关如何撰写此行密钥的任何信息。它在何处以及以何种方式组成?

4 个答案:

答案 0 :(得分:1)

行键是经过排序以创建完整表的简单字节字符串。行可以由连接在一起的多个部分组成,考虑哪些部分属于该行以及以什么顺序排列,因为这对应于该行中将包含多少内容(每行有100MB的限制)以及其效率如何扫描连续的行。

用于模式设计的Cloud Bigtable文档在这里:https://cloud.google.com/bigtable/docs/schema-design

相同的概念适用于HBase和类似的数据库:https://mapr.com/blog/guidelines-hbase-schema-design/

答案 1 :(得分:0)

我不确定我理解你的问题,但我会尝试对行密钥进行一般说明。与SQL表不同,您不需要创建主键列,Bigtable表已经内置了主键的概念。您只需要确定要在其中存储的内容。实现明智,Bigtable不会尝试解释密钥并将它们视为字节数组。

另一方面,值需要在插入数据之前至少创建一个列族。您可以使用cbt命令行工具创建列族。您可以在此处找到如何安装它的说明: https://cloud.google.com/bigtable/docs/go/cbt-overview 有关管理表格的一般信息: https://cloud.google.com/bigtable/docs/managing-tables

答案 2 :(得分:0)

这是一个Python代码示例,该示例创建一个示例行键并将其添加到从CBT表返回的键列表中:

SampleRowKey = namedtuple("SampleRowKey", "row_key offset_bytes")
keys.insert(0, SampleRowKey(b'', 0))

希望这会有所帮助。

答案 3 :(得分:0)

编写行键是BT中数据模型设计的重要组成部分。在设计表格时,您需要事先知道如何获取数据,以优化BT的使用。

BT最擅长通过rowkey提取一行。因此,如果您可以将表(和应用程序的数据模型)设计为始终通过特定键来获取,那就太棒了。

例如,每个用户都将其用户ID(例如“ 1234”)作为其行键。并且您始终按用户ID进行获取(“获取用户ID“ 1234”')。简单。

但是事情并不总是那么容易。在某些数据模型中,所需的数据分散在多行中。这比以前的情况不理想,但仍然可以工作。这种获取模式称为“扫描”-BT支持它,但有一个重要的警告:它只能获取共享公共前缀的所有行。此外,与按行提取相比,扫描也较慢。

在上述示例的上下文中,扫描将意味着“获取具有以“ 123”开头的userid的所有行”。当然,这没有什么意义:您几乎不需要通过共享前缀来拉用户ID。但是在某些数据模型中,使用扫描可能有意义。例如,如果您的行键是一个时间戳,并且您想获取两个时间戳之间的所有项目。

您可以通过在不同字段中组合行键来将其提升到一个新的水平-从而可以进行更有趣的扫描:

如果数据模型要求通过用户ID和时间戳范围进行提取,则可以这样构成行键:“ userid-timestmap”,然后提取所有以“ 1234-(start-timestmap)”开头的行,并在“ 1234-(结束时间戳记)”处结束。我相信这就是“组成”行键的意思。

(要记住的另一件事,如此处的另一个答案所述,您要避免在表上创建“热点”:为了优化并行更新,不应将流行的行彼此相邻存储因为行键是按字典顺序存储在BT中的,所以避免热点的一种方法是选择或组合行键,以使流行键在字典上不彼此靠近。