BigQuery 用于记录具有不同属性的不同类型的事件

Posted

技术标签:

【中文标题】BigQuery 用于记录具有不同属性的不同类型的事件【英文标题】:BigQuery for logging events of different types with different properties 【发布时间】:2013-12-11 13:46:35 【问题描述】:

我想从我的客户端组件记录事件并在谷歌的 BigQuery 中分析它们。我的问题是事件有几种不同的类型(未来可能会添加更多类型)——每种事件类型都有不同数量和类型的属性。

例如:

"事件":"动作", "属性":"ts":1384441115, "distinct_id":"5EB54670", "action_type":"暂停", "时间":"5"

"事件":"动作", "属性":"ts":1384441115, "distinct_id":"5EB54670", “action_type”:“简历”, "时间":"15"

“事件”:“部分”, "属性":"ts":1384441115, "distinct_id":"5EB54670", "section_name":"end", "dl_speed":"0.5 Mbit/s", "时间":"25"

我的问题是 - 我如何在表格数据库中处理这种多样性?我选择 BigQuery 的原因是它能够处理我记录的事件的大数据计算和分析,但要做到这一点,我需要找出记录这些事件的最佳实践。

我考虑了 2 个选项: 1. 有一个大表,其中包含每个事件类型的每个属性的列 - 在这种情况下,每一行都将包含空字段。 2. 每种事件类型都有一个单独的表 - 这引发了两个问题 - 未来的事件将需要新表,甚至更糟糕 - 我失去了对所有事件执行计算的能力(因为所有事件共享一些属性,如 ts、distinct_id 和时间)

我很确定我不是在用我的用例发明***,所以我很想听听你们的最佳实践。谢谢!

阿米特

【问题讨论】:

【参考方案1】:

您有多种选择:

    使用宽架构。您可以为每种属性类型设置一列。您可以使用 tables.update() 方法将列添加到表中。虽然拥有大量空列似乎效率低下,但这实际上是存储和查询数据的最有效方式。

    Null 值不需要任何存储成本,(例如,如果您有一个包含 100 万行的表和一个只有 10 行具有值的列,而其余行为空,则您只需为存储 10值)。更好的是,空值也不需要任何查询。拥有宽表架构意味着您的查询成本更低,因为您不会读取每个查询的所有属性,而只会读取您关心的列。

    将重复字段中的属性存储为键值对。在这种情况下,您可能需要一个我们尚未记录的关键字——OMIT ... IF。这是一种非常干净的方法,您最终会得到看起来像

    的查询
    SELECT properties.value FROM my_table
    OMIT properties IF properties.name <> "dl_speed"
    

    当然,在这种情况下,某些查询可能会变得很尴尬。

    将属性存储在 JSON 字段中,并在查询中提取您需要的字段名称。我们最近添加了一些功能,可以让这变得简单和高效,但是它们还没有完全投入生产。我会尽量记住在这些发布时更新这个答案,希望是今天,但 12 月的发布时间表可能无法预测。

    我建议不要使用单独的表来加入。虽然这是在关系数据库世界中做事的常用方法,但在 BigQuery 中效率会降低。我们通常建议您对数据进行非规范化处理。

【讨论】:

以上是关于BigQuery 用于记录具有不同属性的不同类型的事件的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 记录类型缺失

如何连接 BigQuery 已分配不同类型的整数字段?

按最近日期加入 BigQuery 中具有重复记录的表

不同维度类型的相同事实

查询“记录”中的特定值

如何在 bigquery 中转储具有未知内容的 json?