TopN 查詢,即從數據中實時查找前N項。當分析師須要排序的維度基數較大時,如從幾十萬名員工或者幾百萬個產品中查詢TopN時,每每會遇到響應速度緩慢,性能不穩定等問題。這給技術團隊帶來很大壓力。Kyligence Enterprise強大的功能之一就是可在秒級完成TopN數據的返回。本篇將重點介紹這個功能的使用技巧。html
在編輯度量的表達式下拉框中,有這樣一個選項「TOP_N」。它就是用來在大數據量狀況下,爲統計排名前N作預計算,從而達到提速百倍的目的的。(具體用法詳見產品手冊)express
假如咱們發送這樣一條查詢語句(某電商公司須要查詢特定時段內交易額最高的前100位賣家):apache
這樣一條普通的查詢語句,其實只須要定義一個sum度量就能解決(同樣可以擊中cube,返回結果)。可是,若是咱們有100W的SELLER_ID(這對於不少須要數據分析的公司來講是小意思),那麼就須要先對這100W條記錄按SUM(PRICE)進行排序,而後再返回前100條。當SELLER_ID達到千萬的時候,你再試試?不去泡杯咖啡(幾十秒~幾分鐘),結果是出不來的。架構
然而,咱們觀察到後面有個limit 100,實際上咱們只關心這100W條SELLER_ID中的前100條,那麼能夠加一個Top度量試試。仍是面對一樣的數據量,仍是發送一樣的查詢語句,但這一次絕對不同。——結果秒級響應,大約是百倍的差別。性能
感受提速百倍是吹出來的?不太相信一個小小TopN度量的價值和能力?請繼續往下,邀請你一塊兒來見證背後的祕密。大數據
仍是上面的查詢例子,若是不設置TopN度量,數據在CUBE中預計算完之後,會這樣保存。
優化
因爲查詢的日期須要跨越一個月,所以大約須要讀取30天*100W=3千萬條記錄,而後聚合成100W(SELLER_ID)以後,再排名統計出前100條。計算量可想而知。網站
若是咱們在PRICE上增長一個TopN度量,那麼數據在CUBE中預計算完之後,會保存成這樣。人工智能
SELLER_ID不保存到RowKey上,而是做爲TopN度量當中的一個值,按sum(price)排列好的順序被保存到Measure區域(該區域會根據TopN中N的設置值保存大於N的記錄個數)。此時再計算前100條時,只須要取30條(PART_ID)記錄進行合併便可。架構設計
同時,這樣作帶來的好處是,再也不須要將SELLER_ID設置爲維度,cuboid中的記錄數也會由於不包含高基數維度列而大大減少。
所以,TopN度量的應用場景爲,當須要排序的維度基數越大時,效果越明顯。
另外,咱們在驗證查詢中是否利用到了Top N的優化策略,能夠在Kyligence的後查詢日誌中,搜索是否包含以下提示信息。
信息一:
INFO [Query df42d20d-d9e6-4d5f-9c3a-844f4de63d39-135] cube.CubeCapabilityChecker : Cube CUBE[name=kylin_sales_cube] CapabilityInfluences: TOP_SELLER@class org.apache.kylin.measure.topn.TopNMeasureType
信息二:
INFO [Query df42d20d-d9e6-4d5f-9c3a-844f4de63d39-135] topn.TopNMeasureType : Rewrite function FunctionDesc [expression=SUM, parameter=KYLIN.KYLIN_SALES.PRICE, returnType=decimal(19,4)] to FunctionDesc [expression=TOP_N, parameter=KYLIN.KYLIN_SALES.PRICE,KYLIN.KYLIN_SALES.SELLER_ID, returnType=topn(100)]
最後分享兩個客戶諮詢較多的實際案例。
某手機供應商須要統計耗電量排名前100的App應用名稱。而App應用的數量接近有80W個,屬於超高基數維度。查詢語句相似於
該表有接近5000W的記錄數,假設咱們只定義維度ApplicationName,ApplicationLevel,DeviceType,Version和度量SUM(BatteryConsume),那麼查詢結果大約是180秒。
利用TopN的功能後,咱們只須要定義維度DeviceType,Version以及度量TopN(BatteryConsume)+ ApplicationName,ApplicationLevel。查詢結果只須要0.7秒。(設置TopN以後的存儲結構相似以下:)
假設該手機供應商在統計耗電量排名前100的App應用名稱時,也同時想看看它們的使用時長統計值,是否也能利用Top來實現呢?查詢語句以下:
因爲TopN中,只能保存一個度量,而該查詢須要同時顯示另外一個度量的統計值,所以該查詢沒法命中TopN設置。然而,咱們能夠改寫一下該語句:
同時,將BatteryConsume設置爲TopN度量,將TimeConsume設置爲普通的sum度量。這樣,子查詢的第一部分就能擊中TopN度量了,而且整個查詢不須要排序。
Kyligence Enterprise是人工智能加強型的數據管理和分析平臺。其智能分析引擎能夠自動加速對大規模數據的洞察,顯著提升數據工程師和分析師的工做效率。
佘磊,Kyligence解決方案組架構師,擁有豐富的BI/數據倉庫項目管理及架構設計經驗,熟悉數據分析,大數據在各行業中的應用。
郵件:info@kyligence.io
電話: +86 21-61060928