您好,登錄后才能下訂單哦!
事實(shí)表和維表進(jìn)行關(guān)聯(lián)計(jì)算時(shí),需要對(duì)維表進(jìn)行頻繁的隨機(jī)訪問(wèn),因此維表要盡量放在內(nèi)存中,才能提高關(guān)聯(lián)計(jì)算的性能。如果維表較大,單機(jī)內(nèi)存放不下,就應(yīng)該考慮用集群方式,將維表分段讀入多臺(tái)機(jī)器的內(nèi)存。下面舉例說(shuō)明集群維表的用法。
假設(shè)有2個(gè)計(jì)算節(jié)點(diǎn),分別為127.0.0.1:8281、127.0.0.1:8282。執(zhí)行如下腳本,可將產(chǎn)品表加載到節(jié)點(diǎn)機(jī)內(nèi)存中:
A | B | |
1 | =["127.0.0.1:8281","127.0.0.1:8282"] | |
2 | fork [[1,20000000],[20000000,40000000]];A1 | =connect("demo1").query@x("select productID,name,price from product where productID>? and productID<=? order by productID ",A2(1),A2(2)).keys(productID) |
3 | =env(product,B2) |
A2:語(yǔ)句fork可在多個(gè)節(jié)點(diǎn)機(jī)上并行執(zhí)行任務(wù),其中[1,20000000]是第1臺(tái)節(jié)點(diǎn)機(jī)的入口參數(shù)。
B2:各節(jié)點(diǎn)按入口參數(shù)分別查詢(xún)產(chǎn)品表。其中1號(hào)節(jié)點(diǎn)取出編號(hào)在1-20000000之間的產(chǎn)品。需要注意的是:各節(jié)點(diǎn)數(shù)據(jù)不能有重合,需按維表主鍵排序,需用key函數(shù)建立物理鍵。
B3:函數(shù)env用來(lái)在節(jié)點(diǎn)機(jī)設(shè)置全局變量,各節(jié)點(diǎn)機(jī)變量名相同,。
接下來(lái)實(shí)現(xiàn)業(yè)務(wù)算法:
A | |
1 | =["127.0.0.1:8281","127.0.0.1:8282"] |
2 | =memory(A1, product) |
3 | =connect("demo1").cursor@x("select orderID,productID,client, quantity from order") |
4 | =A3.switch(productID,A2: productID) |
5 | =A4.groups(client;sum(productID.price *quantity)) |
A2:按名字product在各節(jié)點(diǎn)機(jī)尋找全局變量,返回集群維表。注意集群維表是個(gè)遠(yuǎn)程引用,對(duì)應(yīng)的數(shù)據(jù)在各節(jié)點(diǎn)機(jī)。
A3:從數(shù)據(jù)庫(kù)取出訂單事實(shí)表。事實(shí)表通常數(shù)據(jù)量較大,需要用游標(biāo)返回。事實(shí)表的來(lái)源不限于數(shù)據(jù)庫(kù),任意游標(biāo)都可以。
A4:對(duì)事實(shí)表和集群維表進(jìn)行關(guān)聯(lián)計(jì)算。除了cs.switch()函數(shù),也可以用cs.join()函數(shù)進(jìn)行關(guān)聯(lián)計(jì)算。
A5:對(duì)關(guān)聯(lián)結(jié)果進(jìn)一步計(jì)算,這里以分組匯總為例。
上述例子中,集群維表來(lái)自于數(shù)據(jù)源,底層數(shù)據(jù)結(jié)構(gòu)為序表,但序表無(wú)壓縮,占用空間較大。如果以SPL組表為數(shù)據(jù)源,則內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)為內(nèi)表,而內(nèi)表有壓縮,占用空間較小。
假設(shè)維表已分成2份,各自存為組表,名字都叫product.ctx,分別放置在兩個(gè)節(jié)點(diǎn)機(jī)的0數(shù)據(jù)區(qū)上,則加載數(shù)據(jù)的腳本如下:
A | |
1 | =file@z0("product.ctx", ["127.0.0.1:8281","127.0.0.1:8282"]) |
2 | =A1.create().memory() |
3 | =env(product,A2) |
A1:在各節(jié)點(diǎn)機(jī)的0數(shù)據(jù)區(qū),尋找名為product.ctx的組表,定義為分布組表。
A2:將分布組表加載到各節(jié)點(diǎn)機(jī)內(nèi)存,形成集群維表。
A3:在匯總機(jī)定義全局變量product,指向集群維表。
實(shí)現(xiàn)業(yè)務(wù)算法的腳本如下:
A | |
1 | =connect("demo1").cursor@x("select orderID,productID,client, quantity from order") |
2 | =A1.switch(productID,product: productID) |
3 | =A2.groups(client;sum(productID.price *quantity)) |
A2:直接用全局變量名product引用集群維表,并參與關(guān)聯(lián)計(jì)算。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。