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):
