衆所周知,Apache Kylin 的主要工做就是爲源數據構建 N 個維度的 Cube,實現聚合的預計算。理論上而言,構建 N 個維度的 Cube 會生成 2N 個 Cuboid, 如圖 1 所示,構建一個 4 個維度(A,B,C, D)的 Cube,須要生成 16 個Cuboid。ide
(圖1)blog
隨着維度數目的增長 Cuboid 的數量會爆炸式地增加,不只佔用大量的存儲空間還會延長 Cube 的構建時間。爲了緩解 Cube 的構建壓力,減小生成的 Cuboid 數目,Apache Kylin 引入了一系列的高級設置,幫助用戶篩選出真正須要的 Cuboid。這些高級設置包括聚合組(Aggregation Group)、聯合維度(Joint Dimension)、層級維度(Hierarchy Dimension)和必要維度(Mandatory Dimension)等。ci
本文將着重介紹層級維度(Hierarchy Dimension)的實現原理與適用的場景實例。it
層級維度io
用戶選擇的維度中經常會出現具備層級關係的維度。例如對於國家(country)、省份(province)和城市(city)這三個維度,從上而下來講國家/省份/城市之間分別是一對多的關係。也就是說,用戶對於這三個維度的查詢能夠歸類爲如下三類:table
group by countryclass
group by country, province(等同於group by province)原理
以圖 2 所示的 Cube 爲例,假設維度 A 表明國家,維度 B 表明省份,維度 C 表明城市,那麼ABC 三個維度能夠被設置爲層級維度,生成的Cube 如圖 2 所示。方法
(圖2)im
例如,Cuboid [A,C,D]=Cuboid[A, B, C, D],Cuboid[B, D]=Cuboid[A, B, D],於是 Cuboid[A, C, D] 和 Cuboid[B, D] 就沒必要重複存儲。
圖 3 展現了 Kylin 按照前文的方法將冗餘的Cuboid 剪枝從而造成圖 2 的 Cube 結構,Cuboid 數目從 16 減少到 8。
(圖3)
應用實例
假設一個交易數據的 Cube,它具備不少普通的維度,像是交易的城市 city,交易的省 province,交易的國家 country, 和支付類型 pay_type等。分析師能夠經過按照交易城市、交易省份、交易國家和支付類型來聚合,獲取不一樣層級的地理位置消費者的支付偏好。在上述的實例中,建議在已有的聚合組中創建一組層級維度(國家country/省province/城市city),包含的維度和組合方式如圖 4:
(圖4)
聚合組:[country, province, city,pay_type]
層級維度: [country, province, city]
Case 1 當分析師想從城市維度獲取消費偏好時:
SELECT city, pay_type, count(*) FROM table GROUP BY city, pay_type 則它將從 Cuboid [country, province, city, pay_type] 中獲取數據。
Case 2 當分析師想從省級維度獲取消費偏好時:
SELECT province, pay_type, count(*) FROM table GROUP BY province, pay_type則它將從Cuboid [country, province, pay_type] 中獲取數據。
Case 3 當分析師想從國家維度獲取消費偏好時:
SELECT country, pay_type, count(*) FROM table GROUP BY country, pay_type則它將從Cuboid [country, pay_type] 中獲取數據。
Case 4 若是分析師想獲取不一樣粒度地理維度的聚合結果時:
無一例外均可以由圖 3 中的 cuboid 提供數據 。
例如,SELECT country, city, count(*) FROM table GROUP BY country, city 則它將從 Cuboid [country, province, city] 中獲取數據。