Ami*_*mit 5 logging google-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”}}
我的问题是 - 如何处理表格数据库中的这种多样性?我选择 BigQuery 的原因是它能够处理大数据计算和对我记录的事件进行分析,但要做到这一点,我需要找出记录这些事件的最佳实践。
我考虑了 2 个选项:
1. 有一个大表,其中包含每个事件类型的每个属性的列 - 在这种情况下,每一行都将包含空字段。
2.为每种事件类型都有一个单独的表 - 这会引发两个问题 - 未来的事件将需要新表,甚至最糟糕的是 - 我失去了对所有事件执行计算的能力(因为所有事件共享一些属性,如 ts、distinct_id 和时间)
我很确定我不会用我的用例发明轮子,所以我很想听听你们的最佳实践。谢谢!
阿米特
您有多种选择:
使用宽模式。您可以为每种属性类型设置一个列。您可以使用tables.update()方法向表添加列。虽然拥有大量空列可能看起来效率低下,但这实际上是存储和查询数据的最有效方法。
空值的存储不需要任何费用(例如,如果您有一个包含 100 万行的表和一个只有 10 行包含值且其余为空的列,则您只需为存储 10 个值付费)。更好的是,空值也不需要任何查询成本。拥有宽表模式意味着您的查询成本更低,因为您不会读取每个查询的所有属性,而只会读取您关心的列。
将属性作为键值对存储在重复字段中。在这种情况下,您可能需要一个我们尚未记录的关键字 - OMIT ... IF。这是一种非常干净的方法,您最终会得到如下所示的查询
SELECT properties.value FROM my_table
OMIT properties IF properties.name <> "dl_speed"
Run Code Online (Sandbox Code Playgroud)
当然,在这种情况下,某些查询可能会变得非常尴尬。
将属性存储在 JSON 字段中,并提取查询中所需的字段名称。我们最近添加了一些功能,使这一切变得简单而高效,但是它们还没有完全投入生产。当这些上线时,我会尽力记住更新这个答案,希望是在今天,但 12 月的发布时间表可能是不可预测的。
我建议不要使用单独的表来加入。虽然这是在关系数据库世界中执行操作的常见方法,但在 BigQuery 中效率会较低。我们通常建议您对数据进行非规范化。
| 归档时间: |
|
| 查看次数: |
645 次 |
| 最近记录: |