SPL 分組優(yōu)化技巧

1.????? 常規(guī)分組

當(dāng)分組聚合的結(jié)果集不大時(shí),可以使用groups。例如有學(xué)生成績表存儲(chǔ)在集文件中,表結(jié)構(gòu)如下:


現(xiàn)在計(jì)算每個(gè)學(xué)生的總分?jǐn)?shù):

A1:成績表的數(shù)據(jù)裝入內(nèi)存。

A2:按照studentID字段分組,計(jì)算總分。


如果成績表數(shù)據(jù)太大,無法裝入內(nèi)存,則可以用游標(biāo)方式:

A1:得到成績表的游標(biāo)。

A2:按照studentID字段分組,計(jì)算總分。


當(dāng)成績表記錄很多,分組計(jì)算的結(jié)果集很大時(shí),就要使用groupx:

A1:得到成績表的游標(biāo)。

A2:按照studentID字段分組,計(jì)算總分。

groupx的最后一個(gè)參數(shù)是緩沖區(qū)行數(shù),也就是內(nèi)存里能夠一次處理的記錄條數(shù),這里指定為10000,實(shí)際使用時(shí)要根據(jù)自己的情況進(jìn)行調(diào)整。

2.????? 有序分組

2.1.????? 前半有序

當(dāng)數(shù)據(jù)對(duì)分組字段有序時(shí),可以使用groups@o。如上例中,當(dāng)成績表對(duì)studentID字段有序時(shí),就可以加上選項(xiàng)o:


如果成績表太大,無法裝入內(nèi)存,可以使用游標(biāo):


同樣,如果有序分組的結(jié)果集很大,就不能用groups,這時(shí)要使用group:

group的返回是游標(biāo),這一點(diǎn)跟groups不一樣。

2.2.????? 后半有序

?“后半”有序是指:要分組的表 T 已經(jīng)對(duì)字段a,b有序,現(xiàn)在我們要將表T按字段b進(jìn)行分組。例如有保存銷售記錄的集文件sale.btx,表結(jié)構(gòu)如下:

銷售表對(duì)字段date,employeeID有序,現(xiàn)在要計(jì)算每個(gè)員工的銷售總額,對(duì)employeeID字段做分組,這時(shí)常規(guī)分組會(huì)計(jì)算hash,但這種后半有序的情況可以使用groups@h,看一下實(shí)現(xiàn):

如果銷售表太大,無法裝入內(nèi)存,可以使用游標(biāo):


3.????? 序號(hào)分組

當(dāng)分組表達(dá)式的結(jié)果是序號(hào)的時(shí)候,可以使用groups@n。仍然使用上例的銷售表,現(xiàn)在要計(jì)算統(tǒng)計(jì)每個(gè)月的銷售額,實(shí)現(xiàn)是這樣的:

A1:得到銷售表的游標(biāo)。

A2:把date字段轉(zhuǎn)換為月份,計(jì)算每個(gè)月的銷售總額;如果存在date字段是null的情況,則要加上選項(xiàng)@0。


使用@n之后,會(huì)依據(jù)序號(hào)去分組,而不用再計(jì)算HASH,所以要比不帶@n時(shí)快。

使用3億條數(shù)據(jù)測試,本案例實(shí)際測試結(jié)果:

4.????? 過濾拆分

過濾拆分是指根據(jù)條件分組,滿足條件和不滿足條件的分成兩個(gè)集。使用select可以做到這種拆分,但是要遍歷兩次,即一次select(條件true),和一次select(條件false)。

而使用group和align只需要遍歷一次。以上面成績表為例,現(xiàn)在要把成績及格的和不及格的分成兩組,看一下group的實(shí)現(xiàn):


需要注意的是,使用group過濾拆分的結(jié)果不一定是兩個(gè)集,有可能結(jié)果只有一個(gè)集,如本例中,有可能出現(xiàn)成績都大于60的情況。這時(shí)候需要判斷一下結(jié)果集的個(gè)數(shù),或者使用align,因?yàn)閍lign的結(jié)果肯定是兩個(gè)集,沒有符合條件的記錄,也會(huì)產(chǎn)生一個(gè)空集。來看一下align的實(shí)現(xiàn):


如果想在過濾拆分中把不滿足的寫進(jìn)文件,可以使用select(x;file),看一下實(shí)現(xiàn):

執(zhí)行完成后,A3里是成績及格的,不及格的會(huì)保存到集文件Fail.btx。


如果要拆分為多個(gè)集,可以使用groupn。例如要把成績分為優(yōu)秀、良好、及格和不及格這些集合,可以這樣實(shí)現(xiàn):

5.????? 組內(nèi)TopN

top也可以用于group中,例如計(jì)算每個(gè)部門里薪水的最大值:

A1:得到員工表的游標(biāo)。

A2:按照dept字段分組,組內(nèi)再求最高薪水值,命名為topSalary。


A2執(zhí)行結(jié)果的MaxSalary字段是數(shù)值,如果想查詢薪水最高的員工的信息,可以寫成這樣:


top不僅可以返回最大值,還可以得到前n個(gè)最靠前的值,這時(shí)把1寫成n即可。例如計(jì)算每個(gè)部門里薪水排前三名的員工的信息:


6.????? 并行

使用groups進(jìn)行分組計(jì)算時(shí),還可以采取并行方式進(jìn)一步提高性能,這時(shí)要加上選項(xiàng)@m。

如上面例中,計(jì)算每個(gè)員工的銷售總額,看一下并行方式的實(shí)現(xiàn):


如果數(shù)據(jù)太大,無法裝入內(nèi)存,可以使用多路游標(biāo):

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 簡單合并(FROM) 所謂跨庫數(shù)據(jù)表,是指邏輯上同一張數(shù)據(jù)表被分別存儲(chǔ)在不同數(shù)據(jù)庫中。其原因有可能是因?yàn)閿?shù)據(jù)...
    小黃鴨呀閱讀 404評(píng)論 0 1
  • 3 半內(nèi)存時(shí)的外鍵表 外鍵指針化的前提是事實(shí)表和維表都可以裝入內(nèi)存,但實(shí)際業(yè)務(wù)中涉及的數(shù)據(jù)量可能很大,那就不能采用...
    小黃鴨呀閱讀 258評(píng)論 0 0
  • 大多數(shù)JAVA程序猿都選擇使用POI或者HSSFWorkbook等第三方類庫來實(shí)現(xiàn)Excel自動(dòng)化合并,這樣一來不...
    小黃鴨呀閱讀 1,068評(píng)論 0 0
  • 和傳統(tǒng)的程序設(shè)計(jì)語言不同,SPL中集合的應(yīng)用非常普遍,實(shí)際上最常見的序列和序表等本質(zhì)上都是集合,可以對(duì)它們進(jìn)行真正...
    小黃鴨呀閱讀 416評(píng)論 0 0
  • 前些日子,小區(qū)門口的菊花開了,大朵大朵,招招搖搖。進(jìn)進(jìn)出出,人們總被那姹紫嫣紅所迷醉,剛才路過,我卻驚詫于...
    開心就好7947閱讀 3,046評(píng)論 0 10

友情鏈接更多精彩內(nèi)容