您好,登錄后才能下訂單哦!
事實表和維表進行關聯計算時,需要對維表進行頻繁的隨機訪問,因此維表要盡量放在內存中,才能提高關聯計算的性能。如果維表較大,單機內存放不下,就應該考慮用集群方式,將維表分段讀入多臺機器的內存。下面舉例說明集群維表的用法。
假設有2個計算節點,分別為127.0.0.1:8281、127.0.0.1:8282。執行如下腳本,可將產品表加載到節點機內存中:
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:語句fork可在多個節點機上并行執行任務,其中[1,20000000]是第1臺節點機的入口參數。
B2:各節點按入口參數分別查詢產品表。其中1號節點取出編號在1-20000000之間的產品。需要注意的是:各節點數據不能有重合,需按維表主鍵排序,需用key函數建立物理鍵。
B3:函數env用來在節點機設置全局變量,各節點機變量名相同,。
接下來實現業務算法:
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在各節點機尋找全局變量,返回集群維表。注意集群維表是個遠程引用,對應的數據在各節點機。
A3:從數據庫取出訂單事實表。事實表通常數據量較大,需要用游標返回。事實表的來源不限于數據庫,任意游標都可以。
A4:對事實表和集群維表進行關聯計算。除了cs.switch()函數,也可以用cs.join()函數進行關聯計算。
A5:對關聯結果進一步計算,這里以分組匯總為例。
上述例子中,集群維表來自于數據源,底層數據結構為序表,但序表無壓縮,占用空間較大。如果以SPL組表為數據源,則內存中的數據結構為內表,而內表有壓縮,占用空間較小。
假設維表已分成2份,各自存為組表,名字都叫product.ctx,分別放置在兩個節點機的0數據區上,則加載數據的腳本如下:
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:在各節點機的0數據區,尋找名為product.ctx的組表,定義為分布組表。
A2:將分布組表加載到各節點機內存,形成集群維表。
A3:在匯總機定義全局變量product,指向集群維表。
實現業務算法的腳本如下:
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引用集群維表,并參與關聯計算。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。