【问题标题】:Finding unique customers in a selected day range在选定的日期范围内寻找唯一的客户
【发布时间】:2023-02-07 09:09:37
【问题描述】:

我有一个简单的表如下:

day     order_id    customer_id
1       1           1
1       2           1
1       3           2
2       4           1
2       5           1

我想从第 1 天到第 2 天找到一些独特的客户。答案是 2。

但是我的表很大,查询时间很长。所以我想将聚合数据存储在另一个表中以减少数据大小并加快查询速度。我从上表创建了一个新表。

day     uniq_customer
1       2
2       1

现在,如果我想从第 1 天到第 2 天找到一个独特的客户,我得到 2 + 1 = 3,而答案是 2。

有没有什么办法可以在不查询旧表的情况下找到解决方法。

PS:我使用的是 Druid 作为数据源。

【问题讨论】:

    标签: database algorithm data-structures druid


    【解决方案1】:

    这取决于数据的趋势。例如,如果您有少量不同的客户和天数,则可以将客户每天保存在一个位向量中。最后,只需 or 查询中日期的位向量,结果将是位的总和。实施起来可能很无聊。

    如果您有大量不同的客户和日期,请按客户分块并按日期排序。然后对于每个客户,使用二分查找获取天大于或等于查询开始的第一行的索引,并获取天小于或等于查询结束的第一行的索引。这两个指数之间的差异加 1 为您提供了客户的查询适合天数。复杂性变为#customers x 2 x O(log #customerRecords)。

    【讨论】:

      【解决方案2】:

      Apache Druid 支持对这种查询使用近似值。看一下在 Druid 中使用近似值的教程:https://druid.apache.org/docs/latest/tutorials/tutorial-sketches-theta.html

      在 Druid 中,您还可以在摄取时部分聚合到 Theta Sketches 中,并在查询时随时间或其他分组维度聚合它们。这是专门为处理大量数据而设计的,您可以控制近似值的准确性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-30
        • 1970-01-01
        • 2014-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多