天天看点

一个关于kylin的疑惑问题处理方法

自从研究了kylin这个系统之后,就一直有一个疑惑,那就是kylin针对某一特定查询条件建立的cube,只能在这个条件下查询预计算的结果,如果条件一旦换了,cube就废了。带着这个疑问我在很多技术群里和别人讨论和争辩,都没有结果。看了很多网上分析的文章,都没有关于这个疑问的详细解答,于是今天自己试着写了一下cube,发现了一点点东西,总结一下,分享出来。

问题

Id Age Salary

1 28 300

1 28 300

2 30 320

1 29 310

2 30 320

3 33 350

3 32 340

假设有以上的表employee,有3个字段,分别为Id,Age,Salary,现在对这个表建立cube,其中度量为sum(salary),维度为Id,where条件为age>30,查询语句如下:

建立的cube只有一个,即:

id sum(salary)

2 640

3 690

那么此时,如果查询是:

正确的查询结果是:

id sum(salary)

1 910

那么显然这样一个查询结果在上边的cube中指没有的,如果查询是:

正确的查询结果是:

id sum(salary)

3 350

那么显然,在上述的cube中也是查找不出来的。

究其原因,是因为在建立的cube中已经没有了age字段,已经无法通过age字段区做过滤。

处理方法

那么如果在维度字段中增加age,会是什么情况呢?

现在把建立cube的唯独字段增加一个age字段后,查询语句如下:

构建出的cube有3个,分别是

cube1

id sum(salary)

1 310

2 640

3 690

cube2

age sum(salary)

30 640

32 340

33 350

cube3

id age sum(salary)

2 30 640

3 32 340

3 33 350

那么如果这时要以任意的age>29为条件进行查询,都是可以从cube3中查询的,例如age>30的查询,聚合cube3的最后两行即可。但是如果要查询的是age<29,那么显然,从上述3个cube中都查询不出来。