成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

數(shù)據(jù)產(chǎn)品通用復(fù)合指標(biāo)查詢計(jì)算的實(shí)踐

yy13818512006 / 1734人閱讀

摘要:提供靈活的數(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>結(jié)構(gòu)的,并提供提供以下數(shù)據(jù)變換操作。

命名規(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

相關(guān)文章

  • 自研實(shí)時(shí)計(jì)算模塊介紹及運(yùn)維數(shù)據(jù)應(yīng)用場(chǎng)景實(shí)施

    自研實(shí)時(shí)計(jì)算模塊介紹及運(yùn)維數(shù)據(jù)應(yīng)用場(chǎng)景實(shí)施 img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; ...

    不知名網(wǎng)友 評(píng)論0 收藏2564
  • 深入淺出排序?qū)W習(xí):寫給程序員算法系統(tǒng)開(kāi)發(fā)實(shí)踐

    引言 我們正處在一個(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 ...

    caige 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<