用python进行Bigtable数据建模和查询。

问题描述 投票:1回答:1

这是我第一次使用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下,这很难做到......或者是我在库中遗漏了一个技巧,以便能够相应地关联事件数据?

python google-cloud-bigtable bigtable
1个回答
1
投票

这是一个很好的问题tasha,也是我以前遇到过的问题,所以谢谢你的提问。

在Bigtable中,并没有让列从同一写连接的概念。这对一些人来说是非常有帮助的,因为你可以很灵活地使用各种列和版本,但在你的情况下,它会导致这个问题。

处理这个问题的最好方法是用2个步骤。

  1. 确保 每次写到一行 你使用相同的时间戳来写。这样看起来就像这样。

        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()
    
  2. 然后当你查询数据库的时候,你可以应用一个过滤器来获取最新的版本或者最新的N个版本,或者基于时间戳范围的扫描。

    rows = table.read_rows(filter_=row_filters.CellsColumnLimitFilter(2))

这里有一个 一些关于如何使用过滤器的例子的片段 与Bigtable读数。它们应该很快就会被添加到文档中。

© www.soinside.com 2019 - 2024. All rights reserved.