在一个日期范围内使用 QDigest

Using QDigest over a date range

我需要为某些仪表板数据保留 28 天的历史记录。本质上,我有一个通过我们的 BI 系统记录的 event/action。我想计算过去 1 天、7 天和 28 天的事件数和执行该事件的不同用户。我还使用分组集(立方体)通过 country/browser/platform 等

获取完全分段的数据

旧方法是针对所有细分为每个用户保留 28 天的历史记录。因此,如果用户在所有 28 天内每天都从移动设备和桌面设备访问该站点,他们将在数据库中有 54 行。这最终会变成一个很大的 table 并且即使计算 approx_distinct 也很耗时并且不明显。但问题是我也想计算approx_percentiles。

于是开始调查HyperLogLog的用户https://prestodb.io/docs/current/functions/hyperloglog.html
这很好用,它每天存储草图比每天存储整个唯一用户列表更有效。当我使用 approx_distinct 时,这些值足够接近并且有效。

然后我注意到中位数有类似的功能。 Q文摘。 https://prestodb.io/docs/current/functions/qdigest.html 不幸的是,本页的文档不如前几页那么好,所以我花了一些时间才弄明白。这对于计算每日中位数非常有用。但如果我想计算较长时间段内每个用户的平均操作数,它就不起作用了。 HyperLogLog 中的示例演示了如何在一段时间内计算 approx_distinct 用户,但 Qdigest 文档没有给出这样的示例。

当我使用 Qdigest 尝试 HLL 示例的日期范围时得到的结果我得到的结果类似于 1 天的结果。

因为您需要基于每个用户跨多天聚合(求和)的中位数,所以您需要在插入 qdigest 之前执行该聚合,以便它适用于 7 - 以及 28 天的每位用户计数。换句话说,数据的单位需要保持一致,如果将每日值插入到 qdigest 中,则不能将 qdigest 用于 7 天或 28 天的每个用户事件计数。