我想记录来自客户端组件的事件,并在google的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”}}
我的问题是 - 如何在表格数据库中处理这种多样性?我选择BigQuery的原因是它能够处理大数据计算和分析我记录的事件,但为了实现这一点,我需要找出记录这些事件的最佳实践。
我想到了两个选择:
1.有一个大表,每个事件类型的每个属性都有列 - 在这种情况下,每一行都包含空字段
2.为每种事件类型都有一个单独的表 - 这引发了两个问题 - 未来事件将调用新表,甚至最差 - 我失去了对所有事件执行计算的能力(看到所有事件共享某些属性,如ts,distinct_id和时间)
我很确定我没有用我的用例发明轮子,所以我很想知道你们的最佳做法。谢谢!
阿米特
答案 0 :(得分:4)
您有多种选择:
使用宽架构。您可以为每种属性类型都有一列。您可以使用tables.update()方法向表中添加列。虽然拥有大量空列似乎效率低下,但实际上这是存储和查询数据的最有效方法。
空值不需要存储任何东西,(例如,如果你有一个包含一百万行的表,一列只有10行有一个值而其余的都是null,那么你只需为10个存储空间收取费用值)。更好的是,null值也不需要查询任何内容。拥有一个宽表模式意味着您的查询成本更低,因为您不会阅读每个查询的所有属性,只读取您关心的列。
将属性存储在重复字段中作为键值对。在这种情况下,您可能需要一个我们尚未记录的关键字 - OMIT ... IF。这是一种非常干净的方式,你最终会得到类似
的查询SELECT properties.value FROM my_table
OMIT properties IF properties.name <> "dl_speed"
当然,在这种情况下,某些查询可能会变得非常尴尬。
将属性存储在JSON字段中,并在查询中提取所需的字段名称。我们最近添加了一些功能,这将使这个简单而有效,但他们尚未完全投入生产。我会尽量记住在这些答案生效时更新这个答案,希望今天能够这样,但12月的发布时间表可能无法预测。
我建议不要让一个单独的表加入。虽然这是在关系数据库世界中做事的常用方法,但在BigQuery中效率会降低。我们通常建议您对数据进行非规范化。