溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

性能優(yōu)化技巧 - 集群維表

發(fā)布時(shí)間:2020-08-03 19:29:20 來(lái)源:網(wǎng)絡(luò) 閱讀:129 作者:raqsoft 欄目:大數(shù)據(jù)

事實(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)存中:


AB
1=["127.0.0.1:8281","127.0.0.1:8282"]
2fork [[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ì)算。


向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI