大表数据建模和python查询
Posted
技术标签:
【中文标题】大表数据建模和python查询【英文标题】:Bigtable data modeling and query with python 【发布时间】:2020-05-01 18:49:32 【问题描述】:这是我第一次使用 BigTable,我不知道我是否不懂 bigtable 建模或如何使用 python 库。
关于我正在存储的内容的一些背景:
我正在存储时间序列事件,假设有两列名称和消息,我的行键是“#200501163223”,所以行键包含这种格式的时间 '%y%m%d%H%M%S'
假设稍后我需要添加另一个名为“类型”的列。
另外,同一秒可能有两个事件。
如果我存储 2 个事件,这就是我最终得到的结果,而第二个事件具有额外的“类型”数据:
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 的“类型”值属于哪个事件 1 或 2?这个模型是不是错了,我必须确保只有一个事件可以存储在一个很难做到的行键下。或者我在库中是否缺少能够相应地关联事件数据的技巧?
【问题讨论】:
【参考方案1】:这是一个很好的问题 tasha,我以前也遇到过,所以谢谢你的提问。
在 Bigtable 中,没有将列从同一个写入连接的概念。这对某些人非常有帮助,因为您可以灵活地处理各种列和版本,但在您的情况下,它会导致此问题。
处理此问题的最佳方法是分两步。
确保each time you write to a row 对该写入使用相同的时间戳。看起来像这样:
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))
这里有一个 few snippets with examples on how to use a filter 与 Bigtable 读取。它们应该很快就会添加到文档中。
【讨论】:
谢谢!我将测试这种方法,看看它是否能解决我的问题。 我认为我应该能够通过按时间戳对数据进行分组来实现我所需要的(您的示例有助于确保相同的单元格共享相同的时间戳)。过滤器选项的链接也很有帮助! 很高兴为您提供帮助,如果您也能够将其标记为已接受的答案,那将会很震撼。谢谢!以上是关于大表数据建模和python查询的主要内容,如果未能解决你的问题,请参考以下文章