自从研究了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中都查询不出来。