摘要:提供靈活的數(shù)據(jù)變換能力能夠通過(guò)配置對(duì)相應(yīng)指標(biāo)包括指標(biāo)值環(huán)比占比同比等自動(dòng)計(jì)算,減少過(guò)多的冗余代碼。同時(shí)配合使用數(shù)據(jù)變換模塊和數(shù)據(jù)對(duì)象映射能夠釋放更大的靈活性,將數(shù)據(jù)變換模塊數(shù)據(jù)對(duì)象映射復(fù)合指標(biāo)計(jì)算模塊解耦。
本文由作者王改革授權(quán)網(wǎng)易云社區(qū)發(fā)布。
一、背景和實(shí)現(xiàn)目標(biāo)
在開(kāi)發(fā)嚴(yán)選數(shù)據(jù)產(chǎn)品(大麥商品數(shù)據(jù)運(yùn)營(yíng)平臺(tái)和移動(dòng)數(shù)據(jù)工作臺(tái)VIPAPP)的時(shí)候,最多的業(yè)務(wù)場(chǎng)景就是對(duì)實(shí)時(shí)和離線數(shù)據(jù)模型中查詢、處理、統(tǒng)一數(shù)據(jù)結(jié)構(gòu)返回給前端。所以在開(kāi)發(fā)的同時(shí)也一直在思考如何將這些相似的數(shù)據(jù)處理流程統(tǒng)一起來(lái),更關(guān)注數(shù)據(jù)指標(biāo)本身。
開(kāi)發(fā)中經(jīng)常遇到的幾個(gè)問(wèn)題是:
數(shù)據(jù)查詢連接管理分散
模型查詢結(jié)果緩存分散
對(duì)于模型數(shù)據(jù)查詢結(jié)果缺少統(tǒng)一的數(shù)據(jù)變換模塊支持,每日產(chǎn)出的實(shí)時(shí)數(shù)據(jù)指標(biāo)以及離線數(shù)據(jù)指標(biāo)經(jīng)過(guò)后端邏輯做接口返回的時(shí)候,會(huì)有大量的get、set操作,如果同時(shí)需要計(jì)算指標(biāo)同比、環(huán)比、占比、對(duì)比值等復(fù)合指標(biāo)時(shí),就會(huì)充斥大量的重復(fù)臟代碼。
依賴的數(shù)據(jù)服務(wù)對(duì)存儲(chǔ)在MySQL、GP、Kylin、HBase等存儲(chǔ)引擎的數(shù)據(jù)模型暫時(shí)沒(méi)有多模型的連接支持。
所以針對(duì)以上問(wèn)題,我們希望能夠設(shè)計(jì)出能夠在數(shù)據(jù)產(chǎn)品中使用的通用指標(biāo)查詢計(jì)算模塊(DPRequestManager),主要實(shí)現(xiàn)如下目標(biāo):
管理數(shù)據(jù)模型查詢,封裝對(duì)于 統(tǒng)一查詢服務(wù)(DQS)、MySQL等查詢請(qǐng)求,提供查詢連接池。
提供靈活的數(shù)據(jù)變換能力
能夠通過(guò)配置對(duì)相應(yīng)指標(biāo)(包括指標(biāo)值、環(huán)比、占比、同比等)自動(dòng)計(jì)算,減少過(guò)多的冗余代碼。
支持?jǐn)?shù)據(jù)對(duì)象映射,減少頻繁的取值和賦值操作
支持查詢級(jí)別的緩存(可以根據(jù)系統(tǒng)需求自定義緩存時(shí)間、可以設(shè)定緩存條件),減少對(duì)依賴服務(wù)的查詢壓力。
二、通用指標(biāo)查詢計(jì)算模塊(DPRequestManager)組織結(jié)構(gòu)
紅色部分的并發(fā)查詢器負(fù)責(zé)管理數(shù)據(jù)產(chǎn)品與底層數(shù)據(jù)查詢存儲(chǔ)引擎的連接,統(tǒng)一管理各種數(shù)據(jù)查詢。DPRequestManager會(huì)作為數(shù)據(jù)產(chǎn)品模型查詢的統(tǒng)一入口,封裝底層數(shù)據(jù)模型存儲(chǔ)引擎,為數(shù)據(jù)查詢提供線程池服務(wù)。同時(shí)此部分還提供模型退化的能力。
統(tǒng)一緩存模塊負(fù)責(zé)對(duì)數(shù)據(jù)查詢做條件緩存,對(duì)于每日數(shù)據(jù)未產(chǎn)出或者其他情況可以對(duì)查詢結(jié)果約定一些必要條件來(lái)決定是否緩存查詢結(jié)果(緩存級(jí)別為請(qǐng)求級(jí)別)。
橙色部分的數(shù)據(jù)變換模塊可以對(duì)DQS獲取的多表數(shù)據(jù)進(jìn)行靈活數(shù)據(jù)變換
配置模塊可以對(duì)數(shù)據(jù)關(guān)系映射以及相應(yīng)的復(fù)合指標(biāo)計(jì)算做相應(yīng)配置,統(tǒng)一生成結(jié)果,減少冗余代碼
三、數(shù)據(jù)變換模塊支持操作
對(duì)于從模型存儲(chǔ)引擎查詢結(jié)果處理成List
命名規(guī)則:模塊內(nèi)部將使用數(shù)據(jù)dataKey存放查詢處理結(jié)果,dateKey對(duì)應(yīng)的list結(jié)果可以類比excel行列表,其中的列名對(duì)應(yīng)Map結(jié)構(gòu)的key值。
現(xiàn)在主要提供如下數(shù)據(jù)操作:
compose(多個(gè)查詢集合進(jìn)行組合,做內(nèi)存連接使用,對(duì)于多個(gè)數(shù)據(jù)中存在同名列的情況,可選擇按照FIFO進(jìn)行是否覆蓋)
compose({"group_id", "group_name"}, "result_A", "resultB")
rename(將數(shù)據(jù)某一列列名重新命名)group(基于元數(shù)據(jù)行進(jìn)行分組)
rename ("dk", {"sale_amount_day", "sale_qty_day"}, {"sale_amount, sale_qty"})
group(基于數(shù)據(jù)行進(jìn)行分組)
group(row -> new StringJoiner("_").add(row.get("week").add(row.get("group_id")))
aggregation(基于數(shù)據(jù)行進(jìn)行分組, 然后對(duì)度量指標(biāo)字段進(jìn)行聚合)
aggregation({"week", "group_id", "group_name"}, {sum("sale_amount"), sum("sale_qty")})
shape(數(shù)據(jù)變形,將多列數(shù)據(jù)變成寬表數(shù)據(jù),平坦化透視表結(jié)構(gòu))
intersection(多個(gè)數(shù)據(jù)集合取交集)
top(根據(jù)有序度量取top集合)
四、指標(biāo)計(jì)算配置以及對(duì)象關(guān)系映射
這個(gè)地方主要解決兩個(gè)問(wèn)題:
模型數(shù)據(jù)查詢結(jié)果到數(shù)據(jù)對(duì)象的映射,減少頻繁的取值和賦值,現(xiàn)在通用的ORM框架都能解決這個(gè)問(wèn)題,DPRequestManager為了配合復(fù)合指標(biāo)計(jì)算通過(guò)反射來(lái)實(shí)現(xiàn)數(shù)據(jù)對(duì)象映射部分。
映射過(guò)程中的指標(biāo)計(jì)算(指標(biāo)表達(dá)式計(jì)算、環(huán)比、同比、占比等復(fù)合指標(biāo)的計(jì)算)
DPRequestManager主要是通過(guò)兩個(gè)配置來(lái)配合解決復(fù)合指標(biāo)計(jì)算的問(wèn)題。
第一個(gè)配置主要是定義數(shù)據(jù)對(duì)象映射的數(shù)據(jù)篩選規(guī)則(目標(biāo)數(shù)據(jù)集合、環(huán)比數(shù)據(jù)集合、占比數(shù)據(jù)集合等)
{
"clazz": StockDTO.class, "useDate": "2018-12-07", // 指定目標(biāo)值日期 "hbDate": "2018-12-06", // 指定環(huán)比日期 "hbKey": "group_id", // 計(jì)算環(huán)比使用 "filterKey": "", // 過(guò)濾器 "filterValue": ""
}
第二個(gè)配置是數(shù)據(jù)對(duì)象DTO的配置(通過(guò)注解對(duì)復(fù)合指標(biāo)計(jì)算進(jìn)行配置定義)
DTO配置主要使用了三個(gè)注解,@FromDO,@FunctionDO,@IgnoreAssign
@From 定義簡(jiǎn)單按key取值
@FunctionDO定義復(fù)合指標(biāo)計(jì)算規(guī)則(hb,tb,zb,avg,sum等)
@IgnoreAssign 對(duì)象映射是字段忽略
同時(shí)支持定義的復(fù)合指標(biāo)對(duì)象的指標(biāo)計(jì)算賦值。
@Datapublic class StockSingleVO extends BaseVO { // 簡(jiǎn)單取值,默認(rèn)駝峰轉(zhuǎn)下劃線取字段group_id
private Long groupId; @FromDO(""商品組:"+group_name") private String groupName; // 簡(jiǎn)單取值,直接在庫(kù)量 @FromDO("stock_cnt_zhuzhan_1d") private Number stockCnt; // 環(huán)比,對(duì)在庫(kù)量字段計(jì)算環(huán)比 @FromDO("stock_cnt_zhuzhan_1d") @FunctionDO(types = FunctionTypeEnum.HB) private Number stockCntHB; // 簡(jiǎn)單取值,計(jì)算在庫(kù)+在途量 @FromDO(value = "stock_cnt_zhuzhan_1d+onway_cnt_zhuzhan_1d") private Number stockAndOnwayCnt; // 環(huán)比計(jì)算,計(jì)算在庫(kù)+在途的環(huán)比 @FromDO(value = "stock_cnt_zhuzhan_1d+onway_cnt_zhuzhan_1d") @FunctionDO(types = FunctionTypeEnum.HB) private Number stockAndOnwayCntHB; // 占比計(jì)算 @FromDO(value = "stock_cnt_zhuzhan_1d+onway_cnt_zhuzhan_1d") @FunctionDO(types = FunctionTypeEnum.ZB) private Number stockAndOnwayCntZB;
}
數(shù)據(jù)過(guò)濾規(guī)則配置和數(shù)據(jù)對(duì)象中定義的復(fù)合指標(biāo)計(jì)算配置一起支持?jǐn)?shù)據(jù)對(duì)象映射,這樣可以減少大量重復(fù)賦值取值以及手動(dòng)計(jì)算復(fù)合指標(biāo)的工作。同時(shí)配合使用數(shù)據(jù)變換模塊和數(shù)據(jù)對(duì)象映射能夠釋放更大的靈活性,將數(shù)據(jù)變換模塊、數(shù)據(jù)對(duì)象映射、復(fù)合指標(biāo)計(jì)算模塊解耦。
模塊查詢代碼示例:
/**
condition1,condition2為構(gòu)造的指標(biāo)查詢條件
*/EngineRequest request1 = new EngineRequest(EngineType.DQS, condition1, EngineResultTypeEnum.LIST); // 構(gòu)造查詢請(qǐng)求1EngineRequest request2 = new EngineRequest(EngineType.DQS, condition2, EngineResultTypeEnum.LIST); // 構(gòu)造查詢請(qǐng)求2// 構(gòu)造配置1(數(shù)據(jù)過(guò)濾配置 -> 配置目標(biāo)日期、環(huán)比日期、計(jì)算環(huán)比目標(biāo)分組key)EngineConvertConfig config = new EngineConvertConfig<>(StockSingleVO.class, "2018-12-07", "group_id", null, null);
config.setHbDate("2018-12-06");
Listlist = requestEngineManager.initThreadLocal()
.addRequest(dk1, request1) .addRequest(dk2, request2) .execute() .compose(true, Arrays.asList("date_id", "group_id"), dk_new, dk1, dk2) // 請(qǐng)求結(jié)果連接 .converToList(dk_new, config); // 數(shù)據(jù)對(duì)象映射// 前端數(shù)據(jù)結(jié)構(gòu)組裝SmartQueryResult result = BaseVO.assembleResult(list, StockSingleVO.class);
五、總結(jié)
數(shù)據(jù)產(chǎn)品中很多通用的部分可以抽出來(lái)作為多帶帶模塊或者服務(wù)。文中介紹的復(fù)合指標(biāo)查詢模塊已經(jīng)在大麥商品數(shù)據(jù)運(yùn)營(yíng)平臺(tái)中實(shí)踐,它把數(shù)據(jù)產(chǎn)品指標(biāo)查詢、計(jì)算以及對(duì)象映射等公共部分提取出來(lái),有效的提高開(kāi)發(fā)效率并能夠降低開(kāi)發(fā)成本。
文章來(lái)源: 網(wǎng)易云社區(qū)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/25344.html
自研實(shí)時(shí)計(jì)算模塊介紹及運(yùn)維數(shù)據(jù)應(yīng)用場(chǎng)景實(shí)施 img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; ...
引言 我們正處在一個(gè)知識(shí)爆炸的時(shí)代,伴隨著信息量的劇增和人工智能的蓬勃發(fā)展,互聯(lián)網(wǎng)公司越發(fā)具有強(qiáng)烈的個(gè)性化、智能化信息展示的需求。而信息展示個(gè)性化的典型應(yīng)用主要包括搜索列表、推薦列表、廣告展示等等。 很多人不知道的是,看似簡(jiǎn)單的個(gè)性化信息展示背后,涉及大量的數(shù)據(jù)、算法以及工程架構(gòu)技術(shù),這些足以讓大部分互聯(lián)網(wǎng)公司望而卻步。究其根本原因,個(gè)性化信息展示背后的技術(shù)是排序?qū)W習(xí)問(wèn)題(Learning to ...
閱讀 2361·2021-10-11 10:59
閱讀 2624·2021-10-11 10:58
閱讀 3339·2021-09-08 09:35
閱讀 3876·2021-09-02 15:21
閱讀 1495·2019-08-30 15:53
閱讀 2644·2019-08-29 14:16
閱讀 2097·2019-08-26 14:00
閱讀 2982·2019-08-26 13:52