Caravel+Kylin 實現的OLAP平臺

//
Caravel+Kylin 實現的OLAP平臺 - 開源中國社區
https://www.oschina.net/question/867756_2183772
//
開源OLAP+數據可視化工具–For Apache Kylin – lxw的大數據田地
http://lxw1234.com/archives/2016/06/688.htm
配置Kylin多表查詢
為了支持Kylin中多表查詢,一般是一個事實表關聯多張維度表,并獲取衍生維度,我們通過在Caravel Table中添加自定義字段,并對該字段定義一定規則的表達式(字段串常量),提交到PyKylin之后,PyKylin解析該字符串常量,轉換成與維度表關聯的SQL查詢并返回結果。

//
開源OLAP+數據可視化工具–For Apache Kylin – lxw的大數據田地
http://lxw1234.com/archives/2016/06/688.htm
對于普通單表的使用,請參考:


關鍵字:caravel、olap、kylin、數據可視化
經過我和好友Rocky一段時間的修改和調試,現已將初版的Caravel For Kylin上傳至Github,供大家使用,如有發現任何的問題,可通過本博客或github聯系我們。
GitHub地址:
https://github.com/rocky1001/pykylin/tree/caravel-kylin
https://github.com/rocky1001/caravel/tree/caravel-kylin
基于Caravel 0.8.9
關于Caravel:
http://airbnb.io/caravel/
http://lxw1234.com/archives/2016/06/681.htm
關于PyKylin:https://github.com/wxiang7/pykylin (感謝作者@Wu Xiang)
修改說明
PyKylin:修復where及having條件中的中文問題。支持kylin中多表關聯查詢(實現方式很粗糙,但功能基本實現);優化kylin多表查詢時候時間序列相關的幾個圖表生成的SQL。
Caravel:修復kylin中不支持的部分語法,比如使用timestamp關鍵字作為時間字段的別名。
安裝與啟動
Caravel:按照官網的安裝文檔即可 http://airbnb.io/caravel/installation.htmlPykylin
https://github.com/rocky1001/pykylin/tree/caravel-kylin
強烈推薦使用Python3,避免中文問題。
啟動Caravel:nohup gunicorn -w 16 –timeout 60 -b 0.0.0.0:8080 caravel:app >> /tmp/caravel.log 2>&1 &
注意:不建議使用官網給出的啟動命令,caravel runserver -d避免因查詢頁面關閉造成的Caravel Server掛掉。
使用說明
對于普通單表的使用,請參考:http://lxw1234.com/archives/2016/06/681.htm
配置Kylin多表查詢
為了支持Kylin中多表查詢,一般是一個事實表關聯多張維度表,并獲取衍生維度,我們通過在Caravel Table中添加自定義字段,并對該字段定義一定規則的表達式(字段串常量),提交到PyKylin之后,PyKylin解析該字符串常量,轉換成與維度表關聯的SQL查詢并返回結果。這里做法有些粗糙,但功能基本實現,你可以參考該思路做進一步的優化和修改。
這里以事實表AD_REPORT2為例,其中有維度ID字段AD_ID,在Kylin中構建Cube時候,通過INNER JOIN維度表AD_DIM來獲取維度名稱AD_NAME。
在Caravel的AD_REPORT2中添加字段ad_name,

kylin

該字段表達式為字符串常量:‘$|INNER JOIN (select ad_id as __ad_id,ad_name as __ad_name from LIUXIAOWEN.AD_DIM) as b ON (ad_id = __ad_id)|b.__ad_name|$’
字符串以$開頭和結尾,以|分隔。INNER JOIN (select ad_id as __ad_id,ad_name as __ad_name from LIUXIAOWEN.AD_DIM) as b ON (ad_id = ad_id)定義了維度表、JOIN類型、ON條件,該字符串會直接添加到原始SQL中,作為JOIN子句;在維度表中的字段前面加上為了和事實表中的字段區分而不用考慮表的別名。b.__ad_name定義了使用該字段作為最終的字段取值。
當選擇ad_name作為維度查詢時,Caravel提交給PyKylin的SQL語句為:
SELECT '$|INNER JOIN (select ad_id as __ad_id,ad_name as __ad_name from LIUXIAOWEN.AD_DIM) as b ON (ad_id = __ad_id)|b.__ad_name|$' AS ad_name,
SUM(imp_pv) AS sum__imp_pv
FROM liuxiaowen.AD_REPORT2
WHERE pt >= '2015-06-13'
AND pt <= '2016-06-13'
GROUP BY '$|INNER JOIN (select ad_id as __ad_id,ad_name as __ad_name from LIUXIAOWEN.AD_DIM) as b ON (ad_id = __ad_id)|b.__ad_name|$'
ORDER BY SUM(imp_pv) DESC
LIMIT 50

PyKylin經過轉換后提交給Kylin的SQL語句為:
SELECT b.__ad_name as ad_name,
SUM(imp_pv) AS sum__imp_pv
FROM liuxiaowen.ad_report2
inner join (SELECT ad_id AS __ad_id,ad_name AS __ad_name FROM liuxiaowen.ad_dim) AS b
ON (ad_id = __ad_id)
WHERE pt >= '2015-06-13' AND pt <= '2016-06-13'
GROUP BY b.__ad_name
ORDER BY SUM(imp_pv) DESC

對于時間序列類的圖表,Caravel提交給PyKylin的SQL語句為:
SELECT '$|INNER JOIN (select ad_id as __ad_id,ad_name as __ad_name from LIUXIAOWEN.AD_DIM) as b ON (ad_id = __ad_id)|b.__ad_name|$' AS ad_name,
pt AS _timestamp,
SUM(imp_pv) AS sum__imp_pv
FROM liuxiaowen.AD_REPORT2
JOIN (
SELECT '$|INNER JOIN (select ad_id as __ad_id,ad_name as __ad_name from LIUXIAOWEN.AD_DIM) as b ON (ad_id = __ad_id)|b.__ad_name|$' AS __ad_name
FROM liuxiaowen.AD_REPORT2
WHERE pt >= '2015-06-13' AND pt <= '2016-06-13'
GROUP BY '$|INNER JOIN (select ad_id as __ad_id,ad_name as __ad_name from LIUXIAOWEN.AD_DIM) as b ON (ad_id = __ad_id)|b.__ad_name|$'
ORDER BY SUM(imp_pv) DESC
LIMIT 50
) AS anon_1
ON '$|INNER JOIN (select ad_id as __ad_id,ad_name as __ad_name from LIUXIAOWEN.AD_DIM) as b ON (ad_id = __ad_id)|b.__ad_name|$' = __ad_name
WHERE pt >= '2015-06-13' AND pt <= '2016-06-13'
GROUP BY '$|INNER JOIN (select ad_id as __ad_id,ad_name as __ad_name from LIUXIAOWEN.AD_DIM) as b ON (ad_id = __ad_id)|b.__ad_name|$', pt
ORDER BY SUM(imp_pv) DESC
LIMIT 50000

PyKylin經過優化后的SQL語句為:
SELECT b.__ad_name AS ad_name,
pt AS _timestamp,
SUM(imp_pv) AS sum__imp_pv
FROM liuxiaowen.ad_report2
inner join (SELECT ad_id AS __ad_id,ad_name AS __ad_name FROM liuxiaowen.ad_dim) AS b
ON (ad_id = __ad_id)
WHERE pt >= '2015-06-13' AND pt <= '2016-06-13'
GROUP by b.__ad_name, pt
ORDER by sum(imp_pv) desc
limit 50

該配置方法對于關聯一張維度表獲取多個字段,以及關聯多張維度表獲取多個維度字段同樣適用,只需要在Caravel Table中添加多個字段,表達式的寫法一樣即可。
另外,該修改只針對數據源類型為kylin,對于Caravel使用其他數據源不受影響。
Enjoy it!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容