在https://cloud.google.com/bigtable/docs/schema-design中,清楚地描述了如何选择表格的行键。但我找不到有关如何撰写此行密钥的任何信息。它在何处以及以何种方式组成?
答案 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中的,所以避免热点的一种方法是选择或组合行键,以使流行键在字典上不彼此靠近。