Details
-
Improvement
-
Status: Open
-
Major
-
Resolution: Unresolved
-
v4.0.2
-
None
-
None
Description
背景:
我在线上构建cube时发现必要维度的cuboid组合有时会不被构建。
只有当kylin.cube.aggrgroup.is-mandatory-only-valid=true时才会构建。可是kylin.cube.aggrgroup.is-mandatory-only-valid参数解释是:是否允许 Cube 只包含 Base Cuboid,默认值为 FALSE,当使用 Spark Cubing 时需设置为 TRUE。这个解释看起来有点抽象。
我的困惑:
1.kylin.cube.aggrgroup.is-mandatory-only-valid中的base cuboid是指什么,是指必要维度组的组合吗?
2.该参数解释为当使用 Spark Cubing 时需设置为 TRUE,为何设置为false会导致cuboid构建缺失
问题还原:
测试集的cube kylin_sales_model这个model构建以下的维度组合。
当设置参数为false时 会不构建必要维度的cuboid。
源码中影响的位置
org.apache.kylin.cube.cuboid.DefaultCuboidScheduler#getOnTreeParents(long, org.apache.kylin.cube.model.AggregationGroup) 影响了cuboid的生成,如果为false
if (agg.getMandatoryColumnMask() != 0L) { if (agg.isMandatoryOnlyValid()) { if (fillBit(tmpChild, agg.getMandatoryColumnMask(), parentCandidate)) { return parentCandidate; } } else { tmpChild |= agg.getMandatoryColumnMask(); } } for (Long normal : agg.getNormalDims()) { fillBit(tmpChild, normal, parentCandidate); }
会跳过必要组合作为LowestCuboid。是否改在for循环调用前加入
fillBit(tmpChild, agg.getMandatoryColumnMask(), parentCandidate)