2013-12-11 26 views
4

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

例如:

{ “事件”: “动作”,
        “属性”:{ “TS”:1384441115,
                    “distinct_id”:“5EB54670”,
                    “ACTION_TYPE”: “暂停”,
                    “时间”: “5”}}

{ “事件”: “动作”,
        “属性”:{ “TS”:1384441115,
                    “distinct_id”: “5EB54670”,
                    “ACTION_TYPE”: “简历”,
                    “时间” :“15”}}

{ “事件”: “部分”,
        “属性”:{ “TS”:1384441115,
                    “distinct_id”: “5EB54670”
                    “SECTION_NAME”: “结束”,
                   “dl_speed”:“0。5 Mbit/s的”,
                    “时间”: “25”}}

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

我想到了2个选项:
1.有一个有大量列的大型表格每种事件类型的每个属性 - 在这种情况下,每行都将包含空字段。
2.每个事件类型都有一个单独的表格 - 这引发了两个问题 - 未来事件将要求新表格,甚至最差 - 我无法对所有事件执行计算(因为所有事件共享一些属性,如ts, distinct_id和时间)

我很确定我没有发明轮子与我的用例,所以我很想听听你们的最佳做法。谢谢!

阿米特

回答

4

你有多种选择:

  1. 使用范围的架构。您可以为每个属性类型设置一个列。您可以使用tables.update()方法将列添加到表中。虽然有很多空列可能看起来效率不高,但这实际上是存储和查询数据的最有效方式。

    空值不需要花费任何东西来存储(例如,如果您有一个具有一百万行的表和一列只有10行,其值为空且其余为空的列,那么您只需为存储10个值)。更好的是,空值不需要花费任何东西来查询。拥有宽表模式意味着您的查询更便宜,因为您不会阅读每个查询中的所有属性,而只是您关心的列。

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

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

    当然查询,一些查询可以得到在这种情况下非常尴尬。

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

  4. 我建议不要有一个单独的表加入反对。虽然这是在关系数据库世界中做事情的常用方式,但在BigQuery中效率会降低。我们通常建议您将数据非规范化。

相关问题