,而是一個(gè)對(duì)象{avg:xxx,count:xxx},這樣就可以在平均數(shù)的再計(jì)算時(shí)避免失真(a 和b都是平均數(shù),a= {avg: 10000,count= 500},b= {avg: 2000,count= 100},那a和 b的再平均就是{avg: (a.avg*a.count+b.avg*b.count)/(a.count+b.count),count:a. count+b.count},以此類(lèi)推)。
[0134] 進(jìn)一步地,比對(duì)配置模塊200還用于判斷第二計(jì)算規(guī)則對(duì)應(yīng)的預(yù)期結(jié)果集和第一 計(jì)算規(guī)則對(duì)應(yīng)的結(jié)果集是否相同,若是,則將第一計(jì)算規(guī)則的結(jié)果集作為第二計(jì)算規(guī)則的 結(jié)果集。具體地,比對(duì)配置模塊200用于判斷第二計(jì)算規(guī)則的關(guān)聯(lián)維度、計(jì)算數(shù)值列、計(jì)算 規(guī)則是否和第一計(jì)算規(guī)則的關(guān)聯(lián)維度、計(jì)算數(shù)值列和計(jì)算方法相同,若是,則第二計(jì)算規(guī)則 對(duì)應(yīng)的預(yù)期結(jié)果集和第一計(jì)算規(guī)則對(duì)應(yīng)的結(jié)果集相同。
[0135] 在上述的人口普查的示例中,若分別有兩次groupby的維度組合都是[省份+城 市],則在進(jìn)行后一次的結(jié)果集計(jì)算時(shí),可以直接將第一次的結(jié)果集作為其的結(jié)果集。
[0136] 如圖4所示,通過(guò)提煉groupby維度,對(duì)原始的"SQL"計(jì)算規(guī)則進(jìn)行分解重組, 就可以實(shí)現(xiàn)計(jì)算關(guān)聯(lián)共享的效果。圖中示例的SQL我們簡(jiǎn)稱(chēng)為A、B、C、D,傳統(tǒng)的做法如圖 中左下部分,會(huì)對(duì)原始數(shù)據(jù)做4次"全表計(jì)算"得到A、B、C、D各自的結(jié)果;而本發(fā)明對(duì)4條 "SQL"分解重組之后得到的計(jì)算譜系圖如右下部分,只需要對(duì)原始數(shù)據(jù)做一次全表計(jì)算,繼 而就可以用(城市+高速+收費(fèi)站)的輸出(相當(dāng)于第一計(jì)算規(guī)則的結(jié)果集)作為后兩個(gè) 計(jì)算的輸入,減免不菲的計(jì)算量;而且在分解重組的過(guò)程中也發(fā)現(xiàn)了B和D的重復(fù),只對(duì)其 計(jì)算一遍。
[0137] 本發(fā)明的一實(shí)施方式中,每個(gè)計(jì)算規(guī)則中均包括更新周期,更新模塊300用于根 據(jù)更新周期更新第一計(jì)算規(guī)則的結(jié)果集,保證用戶在利用第一計(jì)算規(guī)則的結(jié)果集作為第二 計(jì)算規(guī)則匹配的輸入數(shù)據(jù)或結(jié)果集時(shí),第二計(jì)算規(guī)則的結(jié)果集的時(shí)效性。當(dāng)然,也可根據(jù)更 新周期更新第二計(jì)算規(guī)則的結(jié)果集,以便第二計(jì)算規(guī)則的結(jié)果集可作為其他計(jì)算的輸入數(shù) 據(jù)時(shí),方便獲得其結(jié)果集最近結(jié)果。
[0138] 雖然在上述的實(shí)施方式中,對(duì)SQL的靈活性做了舍棄,但利用各條件組中的節(jié)點(diǎn) 符號(hào),可以進(jìn)行適當(dāng)?shù)膹浹a(bǔ)。具體地,關(guān)聯(lián)模塊400通過(guò)至少兩個(gè)日志模型的節(jié)點(diǎn)符號(hào),將 至少兩個(gè)日志模型進(jìn)行關(guān)聯(lián)計(jì)算。
[0139] 如圖5所示,ID為300這個(gè)日志模型的計(jì)算節(jié)點(diǎn),和另一個(gè)ID為851日志模型 的計(jì)算節(jié)點(diǎn),兩者的輸出又進(jìn)行了一次聯(lián)合計(jì)算,其中表達(dá)式里的$ {settle}+$ {fininflux} 可以明顯看出是一個(gè)求和動(dòng)作(將兩個(gè)日志的計(jì)算結(jié)果再次求和得到總量)。其中的基準(zhǔn) 維度、補(bǔ)位維度、補(bǔ)位實(shí)例其實(shí)就是SQLJoin語(yǔ)句中涉及的"左右連接"等概念,為的就是 將兩邊的輸出結(jié)果能再次匹配關(guān)聯(lián),繼而做表達(dá)式運(yùn)算,這里不多贅述。
[0140] 在編寫(xiě)SQL時(shí),我們可以認(rèn)為一個(gè)SQL的執(zhí)行結(jié)果是一個(gè)結(jié)果集,而我們也經(jīng)常加 入AS語(yǔ)義,將結(jié)果集AS成一個(gè)自己命名的key-value集合放入持久化存儲(chǔ)。比如在高速 公路日志的例子里,用戶甲和用戶乙都編寫(xiě)了各自的SQL來(lái)統(tǒng)計(jì)杭州市的收費(fèi)總額,對(duì)于 產(chǎn)出的key-value數(shù)據(jù),甲可能命名為"杭州市收費(fèi)總額",乙可能命名為"杭州總收費(fèi)額", 甚至有個(gè)性的用戶還會(huì)命名為"我的家鄉(xiāng)收費(fèi)總額",從而導(dǎo)致相同的數(shù)據(jù)以不同的名稱(chēng)冗 余占據(jù)著持久化存儲(chǔ)的空間。在計(jì)算關(guān)聯(lián)共享之后這種冗余就不復(fù)存在了,在之前A、B、C、 D四條SQL的示例中也能看到,由于B和D的重復(fù),最終拋棄了冗余的計(jì)算規(guī)則,只計(jì)算一 次,只產(chǎn)出一份數(shù)據(jù)。假設(shè)這個(gè)高速公路日志的ID為9527,那"杭州市的收費(fèi)總額"這個(gè)計(jì) 算規(guī)則產(chǎn)出的key-value中,key會(huì)被強(qiáng)制命名為:"日志[9527] +按[城市]維度統(tǒng)計(jì)+ 對(duì)[收費(fèi)]列做求和"(具體的字符串拼接規(guī)則可以多種多樣,只要不產(chǎn)生歧義即可),僅算 一次,僅存一份。但是我們不可能要求用戶用這樣的內(nèi)部key規(guī)范來(lái)訪問(wèn)數(shù)據(jù),所以我們并 不會(huì)取消"AS"語(yǔ)義的能力,而是把它轉(zhuǎn)移為更加下游的功能配置,即"報(bào)表"規(guī)則:
[0141] 如圖6所示,用戶可以基于自己的計(jì)算規(guī)則,繼續(xù)配置一個(gè)報(bào)表,報(bào)表的名稱(chēng)、樣 式隨意選擇,還可以加上黑名單、白名單篩選(類(lèi)似where條件)。無(wú)論是直接在平臺(tái)上展 示該報(bào)表,還是用REST接口訪問(wèn)此報(bào)表的JS0N數(shù)據(jù)(以報(bào)表名或ID作為參數(shù)),都不會(huì)接 觸到計(jì)算關(guān)聯(lián)共享的底層邏輯和規(guī)范。而且在下游彌補(bǔ)了where篩選等語(yǔ)義的缺失。
[0142] 如圖8所示,在本發(fā)明另一實(shí)施方式中,平臺(tái)化日志分析的計(jì)算裝置包括分析處 理模塊100、比對(duì)配置模塊200、更新模塊300、以及關(guān)聯(lián)模塊400。
[0143] 分析處理模塊100用于分別接收第一條件組和第二條件組,并分別對(duì)應(yīng)形成第一 計(jì)算規(guī)則和第二計(jì)算規(guī)則。該第一條件組可比所述第二條件組先接收到,先形成第一計(jì)算 規(guī)則;也可與第二條件組同時(shí)接收到,同時(shí)形成第一、第二計(jì)算規(guī)則。
[0144] 本實(shí)施方式中,通過(guò)約束性較強(qiáng)的可視化配置,配置錄入的規(guī)則。
[0145] 如圖3所示,為說(shuō)明本發(fā)明一實(shí)施方式,舉例說(shuō)明,當(dāng)用戶拿到一個(gè)ID為300的 日志模型后,希望對(duì)它做統(tǒng)計(jì)運(yùn)算,用戶在可視化建模的界面上只需要填入很少的信息即 可:
[0146] ①關(guān)聯(lián)(做groupby)的維度有哪些;
[0147] ②對(duì)哪個(gè)數(shù)值列做計(jì)算(圖中示意這個(gè)日志會(huì)產(chǎn)出count、耗時(shí)、金額三種數(shù)值, 任選其一);
[0148] ③針對(duì)數(shù)值的計(jì)算方式(比如求和、求平均);
[0149] ④可對(duì)這個(gè)計(jì)算節(jié)點(diǎn)取個(gè)獨(dú)立節(jié)點(diǎn)名稱(chēng)(方面后續(xù)配置報(bào)表);
[0150] ⑤節(jié)點(diǎn)符號(hào)命名(方面后續(xù)配置復(fù)雜的表達(dá)式運(yùn)算);
[0151] 暫且不考慮最后兩項(xiàng)(④和⑤),前三項(xiàng)的配置所對(duì)應(yīng)的SQL其實(shí)就是:
[0152]select業(yè)務(wù)類(lèi)型,SUM(count)from日志模型[300],groupby業(yè)務(wù)類(lèi)型(where timebetweenxxxandxxx) 〇
[0153] 時(shí)間的where語(yǔ)義不需要用戶輸入是為了減少?gòu)?fù)雜度,只提供了秒、分鐘等周期 粒度,用戶不需要配置時(shí)間條件,只需要選擇周期粒度即可,系統(tǒng)會(huì)自動(dòng)考慮。
[0154] 通過(guò)對(duì)這些信息(條件組)進(jìn)行配置,也即分別形成了不同的計(jì)算規(guī)則。每個(gè)條 件組均包括相應(yīng)的關(guān)聯(lián)維度、計(jì)算數(shù)值列和計(jì)算方法。
[0155] 比對(duì)配置模塊200用于判斷第二計(jì)算規(guī)則對(duì)應(yīng)的預(yù)期結(jié)果集是否和第一計(jì)算規(guī) 則對(duì)應(yīng)的結(jié)果集相同,若是,則將第一計(jì)算規(guī)則的結(jié)果集作為第二計(jì)算規(guī)則的結(jié)果集。
[0156] 在判斷第二計(jì)算規(guī)則對(duì)應(yīng)的預(yù)期結(jié)果集是否和第一計(jì)算規(guī)則對(duì)應(yīng)的結(jié)果集相同 時(shí),比對(duì)配置模塊200具體用于:判斷第二計(jì)算規(guī)則的關(guān)聯(lián)維度、計(jì)算數(shù)值列、計(jì)算規(guī)則是 否和第一計(jì)算規(guī)則的關(guān)聯(lián)維度、計(jì)算數(shù)值列和計(jì)算方法相同,若是,則第二計(jì)算規(guī)則對(duì)應(yīng)的 預(yù)期結(jié)果集和所述第一計(jì)算規(guī)則對(duì)應(yīng)的結(jié)果集相同。
[0157] 在這個(gè)可視化配置里,我們需要同時(shí)考慮"關(guān)聯(lián)維度"、"計(jì)算數(shù)值列""計(jì)算方法", 還是以人口普查為例,如果第一計(jì)算規(guī)則產(chǎn)出的是[城市]的人口,而第二計(jì)算規(guī)則需要產(chǎn) 出[省份]下的平均收入,那么在進(jìn)行利用第二計(jì)算規(guī)則輸出結(jié)果集時(shí),就不能利用第一計(jì) 算規(guī)則的輸出(因?yàn)殛P(guān)聯(lián)維度不同,一個(gè)是城市,一個(gè)是省份;數(shù)值列不同,一個(gè)是count、 一個(gè)是收入;計(jì)算方式也不同,一個(gè)是求和、一個(gè)是求平均)。
[0158] 如圖4所示,通過(guò)提煉groupby維度,對(duì)原始的"SQL"計(jì)算規(guī)則進(jìn)行分解重組, 就可以實(shí)現(xiàn)計(jì)算關(guān)聯(lián)共享的效果。圖中示例的SQL我們簡(jiǎn)稱(chēng)為A、B、C、D,傳統(tǒng)的做法如圖 中左下部分,會(huì)對(duì)原始數(shù)據(jù)做4次"全表計(jì)算"得到A、B、C、D各自的結(jié)果;而本發(fā)明對(duì)4條 "SQL"分解重組之后得到的計(jì)算譜系圖如右下部分,在分解重組的過(guò)程中可以發(fā)現(xiàn)B和D的 重復(fù),只對(duì)其計(jì)算一遍。
[0159] 本發(fā)明的一實(shí)施方式中,每個(gè)計(jì)算規(guī)則中均包括更新周期,更新模塊300可根據(jù) 更新周期更新第一計(jì)算規(guī)則的結(jié)果集,保證用戶在利用第一計(jì)算規(guī)則的結(jié)果集作為第二計(jì) 算規(guī)則匹配的輸入數(shù)據(jù)或結(jié)果集時(shí),第二計(jì)算規(guī)則的結(jié)果集的時(shí)效性。
[0160] 雖然在上述的實(shí)施方式中,對(duì)SQL的靈活性做了舍棄,但利用各條件組中的節(jié)點(diǎn) 符號(hào),可以進(jìn)行適當(dāng)?shù)膹浹a(bǔ)。具體地,我們可以通過(guò)關(guān)聯(lián)模塊400將至少兩個(gè)日志模型的節(jié) 點(diǎn)符號(hào),將至少兩個(gè)日志模型進(jìn)行關(guān)聯(lián)計(jì)算。
[0161]如圖所示,ID為300這個(gè)日志模型的計(jì)算節(jié)點(diǎn),和另一個(gè)ID為851日志模型的計(jì) 算節(jié)點(diǎn),兩者的輸出又進(jìn)行了一次聯(lián)合計(jì)算,其中表達(dá)式里的${settle}+${fininflux}可 以明顯看出是一個(gè)求和動(dòng)作(將兩個(gè)日志的計(jì)算結(jié)果再次求和得到總量)。其中的基準(zhǔn)維 度、補(bǔ)位維度、補(bǔ)位實(shí)例其實(shí)就是SQLJoin語(yǔ)句中涉及的"左右連接"等概念,為的就是將 兩邊的輸出結(jié)果能再次匹配關(guān)聯(lián),繼而做表達(dá)式運(yùn)算,這里不多贅述。
[0162] 在編寫(xiě)SQL時(shí),我們可以認(rèn)為一個(gè)SQL的執(zhí)行結(jié)果是一個(gè)結(jié)果集,而我們也經(jīng)常加 入AS語(yǔ)義,將結(jié)果集AS成一個(gè)自己命名的key-value集合放入持久化存儲(chǔ)。比如在高速 公路日志的例子里,用戶甲和用戶乙都編寫(xiě)了各自的SQL來(lái)統(tǒng)計(jì)杭州市的收費(fèi)總額,對(duì)于 產(chǎn)出的key-value數(shù)據(jù),甲可能命名為"杭州市收費(fèi)總額",乙可能命名為"杭州總收費(fèi)額", 甚至有個(gè)性的用戶還會(huì)命名為"我的家鄉(xiāng)收費(fèi)總額",從而導(dǎo)致相同的數(shù)據(jù)以不同的名稱(chēng)冗 余占據(jù)著持久化存儲(chǔ)的空間。在計(jì)算關(guān)聯(lián)共享之后這種冗余就不復(fù)存在了,在之前A、B、C、 D四條SQL的示例中也能看到,由于B和D的重復(fù),最終拋棄了冗余的計(jì)算規(guī)則,只計(jì)算一 次,只產(chǎn)出一份數(shù)據(jù)。假設(shè)這個(gè)高速公路日志的ID為9527,那"杭州市的收費(fèi)總額"這個(gè)計(jì) 算規(guī)則產(chǎn)出的key-value中,key會(huì)被強(qiáng)制命名為:"日志[9527] +按[城市]維度統(tǒng)計(jì)+ 對(duì)[收費(fèi)]列做求和"(具體