这是我第一次使用BigTable,我不知道是不懂bigtable建模,还是不懂如何使用python库。
关于我存储的东西的一些背景。
我存储的是时间序列事件,比如说有两列名称和消息,我的rowkey是 "#200501163223",所以rowkey包括时间,格式是"%y%m%d%H%M%S
比方说,以后我需要再增加一列,叫 "类型"。
另外,有可能在同一秒内可以有两个事件。
所以,如果我存储了2个事件,第二个事件有额外的 "type "数据,那么我的最终结果就是这样。
account#200501163223
Outbox:name @ 2020/05/01-17:32:16.412000
"name1"
Outbox:name @ 2020/05/01-16:41:49.093000
"name2"
Outbox:message @ 2020/05/01-17:32:16.412000
"msg1"
Outbox:message @ 2020/05/01-16:41:49.093000
"msg2"
Outbox:type @ 2020/05/01-16:35:09.839000
"temp"
当我用python bigtable库查询这个rowkey时,我得到一个以列名为键,数据为Cell对象列表的字典。
"name "和 "message "键会有2个对象,而 "type "只有一个对象,因为它只是第二个事件的一部分。
我的问题是,我怎么知道temp的 "type "值属于哪个事件,1还是2?是否这个模型是错误的,我必须确保一个事件只能存储在一个rowkey下,这很难做到......或者是我在库中遗漏了一个技巧,以便能够相应地关联事件数据?
这是一个很好的问题tasha,也是我以前遇到过的问题,所以谢谢你的提问。
在Bigtable中,并没有让列从同一写连接的概念。这对一些人来说是非常有帮助的,因为你可以很灵活地使用各种列和版本,但在你的情况下,它会导致这个问题。
处理这个问题的最好方法是用2个步骤。
确保 每次写到一行 你使用相同的时间戳来写。这样看起来就像这样。
timestamp = datetime.datetime.utcnow()
row_key = "account#200501163223"
row = table.direct_row(row_key)
row.set_cell(column_family_id,
"name",
"name1",
timestamp)
row.set_cell(column_family_id,
"type",
"temp",
timestamp)
row.commit()
然后当你查询数据库的时候,你可以应用一个过滤器来获取最新的版本或者最新的N个版本,或者基于时间戳范围的扫描。
rows = table.read_rows(filter_=row_filters.CellsColumnLimitFilter(2))
这里有一个 一些关于如何使用过滤器的例子的片段 与Bigtable读数。它们应该很快就会被添加到文档中。