日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

多維分析后臺(tái)實(shí)踐 3:維度排序壓縮

 raqsoft 2021-01-22

實(shí)踐目標(biāo)

本期目標(biāo),是在完成數(shù)據(jù)類型轉(zhuǎn)化基礎(chǔ)上,實(shí)現(xiàn)維度排序壓縮,進(jìn)一步提升計(jì)算速度。

實(shí)踐的步驟:

1、 準(zhǔn)備基礎(chǔ)寬表:修改上期的代碼,完成維度排序壓縮存成新組表。

2、 訪問基礎(chǔ)寬表:上期代碼不必修改,直接應(yīng)用于新組表。

3、 新增數(shù)據(jù)追加:每日新增業(yè)務(wù)數(shù)據(jù)追加,每月重新排序重整。要盡可能不影響訪問基礎(chǔ)寬表的性能,同時(shí)減小每日新增數(shù)據(jù)所需要的時(shí)間。

本期樣例寬表不變,依然為 customer 表。從 Oracle 數(shù)據(jù)庫中取出寬表數(shù)據(jù)的 SQL 語句是 select * from customer。執(zhí)行結(jié)果如下圖:

 ..

假設(shè)當(dāng)天日期是 2021-01-12,則取出當(dāng)日新增數(shù)據(jù)的 SQL 是:

select * from customer where begin_date=to_date('2021-01-12','yyyy-mm-dd')

多維分析計(jì)算的目標(biāo)也不變,用下面 Oracle 的 SQL 語句表示:

select department_id,job_id,to_char(begin_date,'yyyymm') begin_month ,sum(balance) sum,count(customer_id) count

from customer

where department_id in (10,20,50,60,70,80)

and job_id in ('AD_VP','FI_MGR','AC_MGR','SA_MAN','SA_REP')

and begin_date>=to_date('2002-01-01','yyyy-mm-dd')

and begin_date<=to_date('2020-12-31','yyyy-mm-dd')

and flag1='1' and flag8='1'

group by department_id,job_id,to_char(begin_date,'yyyymm')

準(zhǔn)備寬表

維度排序壓縮:有序列存。列存是指列式存儲(chǔ),集算器新建組表時(shí),默認(rèn)列存。

有序是指字段值物理有序存儲(chǔ),也就是用維度字段排序后存入組表。用于排序的維度字段順序非常關(guān)鍵,要將重復(fù)度高的維度排在前面。

本例的維度包括:department_id,job_num,employee_id,begin_date,customer_id。其中,部門編號 department_id 總數(shù)最少(事實(shí)表中只出現(xiàn) 11 個(gè)部門),所以重復(fù)度最高。其他字段中,job_num,employee_id,begin_date,customer_id 重復(fù)度依次降低。

同時(shí),考慮實(shí)際應(yīng)用中,分組字段出現(xiàn)的情況也和重復(fù)度基本一致,所以排序的字段順序可以確定為:department_id,job_num,employee_id,begin_date,customer_id。

我們用數(shù)據(jù)庫來做排序。示例如下:

select department_id,job_id,employee_id,begin_date,customer_id,first_name,last_name,phone_number,job_title,balance,department_name,flag1,flag2,flag3,flag4,flag5,flag6,flag7,flag8

from customer order by department_id,job_id,employee_id,begin_date,customer_id。

執(zhí)行結(jié)果如圖:

..

根據(jù)以上要求改寫 etl.dfx,從數(shù)據(jù)庫中取出排序數(shù)據(jù),類型轉(zhuǎn)化后,生成組表文件,存儲(chǔ)基礎(chǔ)寬表。代碼示例如下:

AB
1=connect@l("oracle")
2=A1.cursor@d("select   department_id,job_id,employee_id,begin_date,customer_id,first_name,last_name,phone_number,job_title,balance,department_name,flag1,flag2,flag3,flag4,flag5,flag6,flag7,flag8   from customer order by department_id,job_id,employee_id,begin_date,customer_id")
3=A1.query@d("select   job_id from jobs order by job_id")=file("data/job.btx").export@z(A3)  
4=A3.(job_id)=date("2000-01-01")
5=A2.new(int(department_id):department_id,A4.pos@b(job_id):job_num,int(employee_id):employee_id,int(interval@m(B4,begin_date)*100+day(begin_date)):begin_date,int(customer_id):customer_id,first_name,last_name,phone_number,job_title,float(balance):balance,department_name,int(flag1):flag1,int(flag2):flag2,int(flag3):flag3,int(flag4):flag4,int(flag5):flag5,int(flag6):flag6,int(flag7):flag7,int(flag8):flag8)
6=file("data/customer.ctx").create@y(#department_id,#job_num,#employee_id,#begin_date,#customer_id,first_name,last_name,phone_number,job_title,balance,department_name,flag1,flag2,flag3,flag4,flag5,flag6,flag7,flag8)
7=A6.append(A5)>A6.close(),A1.close()

其中:A2 的 SQL 語句增加了排序,A6 的組表指定了排序字段。

其他代碼和上期一致。

數(shù)據(jù)量為一億,導(dǎo)出組表文件和前幾期的組表文件比較如下:

期數(shù)文件大小說明備注
第一期3.5GB直接從數(shù)據(jù)庫導(dǎo)出,未做優(yōu)化
第二期3.0GB完成數(shù)據(jù)類型優(yōu)化
第三期2.4GB完成前面的優(yōu)化和維度排序壓縮

從上表可以看出,完成數(shù)據(jù)類型優(yōu)化之后,文件大小減少了14%(0.5GB)。再完成維度排序壓縮后,又減少了 20%(0.6GB), 總體減少 31%(1.1GB)。文件變小,能減少磁盤讀取數(shù)據(jù)量,有效提高性能。

訪問寬表

訪問寬表的 SPL 代碼、Java 代碼和上期相比沒有變化。

Java 代碼加上后臺(tái)計(jì)算返回結(jié)果總的執(zhí)行時(shí)間,和前期比較如下:

期數(shù)單線程二線程并行備注
第一期120秒75秒
第二期59 秒36 秒
第三期21秒15秒

通過上表的對比可以看出,維度排序壓縮進(jìn)一步提高了計(jì)算性能。

新增數(shù)據(jù)

客戶表每天都會(huì)有新增數(shù)據(jù),需要每天定時(shí)添加到組表文件中。如果是按日期有序的組表文件,將每天產(chǎn)生的新數(shù)據(jù)追加到文件的最后即可。但是我們的客戶組表是按照部門等字段有序的,如果在結(jié)尾直接追加數(shù)據(jù),就不是整體有序了。如果每天都將原有數(shù)據(jù)和新數(shù)據(jù)一起重新排序,計(jì)算的時(shí)間會(huì)比較長。

我們可以從數(shù)據(jù)庫中讀取新數(shù)據(jù)并按照部門等字段排序,再用 T.append@a() 函數(shù)追加,集算器會(huì)自動(dòng)新建一個(gè)補(bǔ)文件,每天新數(shù)據(jù)都有序歸并到補(bǔ)文件中,補(bǔ)文件相對較小,有序歸并耗時(shí)較短。每月只需對客戶表文件和補(bǔ)文件重整一次,將補(bǔ)文件有序歸并到組表文件中。

采用這個(gè)方法,編寫 etlAppend.dfx,網(wǎng)格參數(shù)如下:

..

SPL 代碼如下:

AB
1if day(today)==1=file("data/customer.ctx").reset()
2=connect@l("oracle")
3=A2.cursor@d("select   department_id,job_id,employee_id,begin_date,customer_id,first_name,last_name,phone_number,job_title,balance,department_name,flag1,flag2,flag3,flag4,flag5,flag6,flag7,flag8   from customer where begin_date=? order by department_id,job_id,employee_id,begin_date  ",today)
4=A2.query@d("select   job_id from jobs order by job_id")
5=A4.(job_id)=date("2000-01-01")
6=A3.new(int(department_id):department_id,A5.pos@b(job_id):job_num,int(employee_id):employee_id,int(interval@m(B5,begin_date)*100+day(begin_date)):begin_date,int(customer_id):customer_id,first_name,last_name,phone_number,job_title,float(balance):balance,department_name,int(flag1):flag1,int(flag2):flag2,int(flag3):flag3,int(flag4):flag4,int(flag5):flag5,int(flag6):flag6,int(flag7):flag7,int(flag8):flag8)
7=file("data/customer.ctx").open().append@a(A6)
8>A7.close(),A2.close()

A1:判斷輸入日期是否是每月第一天,如果是,就執(zhí)行 B1 對客戶組表進(jìn)行重整,將新數(shù)據(jù)形成的補(bǔ)文件有序歸并進(jìn)入客戶組表文件。

A2:連接 oracle 數(shù)據(jù)庫。

A3:取出當(dāng)天數(shù)據(jù)。

A4:取出 jobs 表數(shù)據(jù),用于類型轉(zhuǎn)換。

A5、B5、A6 與上期 etl.dfx 相同。

A7:將今天新增數(shù)據(jù)有序歸并到補(bǔ)文件中。

A8:關(guān)閉文件和數(shù)據(jù)庫連接。

etlAppend.dfx 需要每天定時(shí)執(zhí)行。執(zhí)行的方法是用 ETL 工具或者操作系統(tǒng)定時(shí)任務(wù),通過命令行調(diào)用集算器腳本。

例如:

C:\Program Files\raqsoft\esProc\bin>esprocx d:\olap\etlAppend.dfx

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多