在Apache Druid上计算统计模式

时间:2020-03-29 11:51:03

标签: sql group-by statistics aggregate druid

我们正在使用Apache Druid对数据集进行基于时间序列的分析,并且一直试图为其中一种分析计算模式。

统计模式告诉我们有关数据集中最频繁重复的数据点。

示例:给定如下数据集,请尝试计算每种产品最具代表性的销售时段

数据集:

Product ID  Month   Sale Bucket
Pid1    January 10-20
Pid1    February    0-10
Pid1    March   10-20
Pid2    January 0-10
Pid2    February    10-20
Pid2    March   0-10

预期输出:

Product ID  Sale Bucket
Pid1    10-20
Pid2    0-10

尝试了一个简单的Google搜索,以查找是否有内置功能或扩展功能可以执行相同操作。 找不到一个。

然后,我开始尝试使用天真的方法通过以下步骤对此数据集执行模式:

第1步。获取数据点的相关频率(按产品ID和销售时段分组) 产生

Product ID  Sale Bucket Frequency
Pid1    10-20   2
Pid1    0-10    1
Pid2    10-20   1
Pid2    0-10    2

步骤2。以每个产品的最大频率(从1中计算出的频率中)获取相关数据点。我被困在第2点,尝试了2种方法:

  1. 将要选择的列连接为字符串,然后稍后将其删除(在此处对stackoverflow进行解释:SQL Query to get column values that correspond with MAX value of another column?。但是druid似乎不支持对String的MAX / MIN操作。:-/
  2. 尝试使用基于排名的方法按频率对项目进行排名,然后在进一步的选择查询中选择最高排名。德鲁伊不支持Rank运算符。 :-/

有人对进一步进行有任何想法吗?

1 个答案:

答案 0 :(得分:0)

在数据库中执行此操作的常规方法是使用窗口函数,Druid不支持这些函数。可能会发生以下情况:

with ps as (
      select product, salebucket, count(*) as cnt
      from t
      group by product, salebucket
     )
select ps.product, ps.salebucket
from ps join
     (select ps.product, max(cnt) as max_cnt
      from ps
      group by ps.product
     ) ps2
     on ps2.product = ps.product and ps2.max_cnt = ps.cnt;

我不确定100%是否符合Druid SQL的约束,但这可能对您有用。

相关问题