大表数据建模和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查询的主要内容,如果未能解决你的问题,请参考以下文章

对于维度建模的理解

数学建模学习笔记集训十天之第一天

Python数据分析在数学建模中的应用汇总(持续更新中!)

python中随机森林和预测建模的数据准备

Azure CosmosDB (13) CosmosDB数据建模

Python金融大数据风控建模实战