【摘要】
實踐目標本期目標,是在完成資料型別轉化基礎上,實現維度排序壓縮,進一步提升計算速度。
實踐的步驟:
1、 準備基礎寬表:修改上期的程式碼,完成維度排序壓縮存成新組表。
2、 訪問基礎寬表:上期程式碼不必修改,直接應用於新組表。
3、 新增資料追加:每日新增業務資料追加,每月重新排序重整。要儘可能不影響訪問基礎寬表的效能,同時減小每日新增資料所需要的時間。
本期樣例寬表不變,依然為 customer 表。從 Oracle 資料庫中取出寬表資料的 SQL 語句是 select * from customer。執行結果如下圖:
假設當天日期是 2021-01-12,則取出當日新增資料的 SQL 是:
select * from customer where begin_date=to_date('2021-01-12','yyyy-mm-dd')
多維分析計算的目標也不變,用下面 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')
準備寬表維度排序壓縮:有序列存。列存是指列式儲存,集算器新建組表時,預設列存。
有序是指欄位值物理有序儲存,也就是用維度欄位排序後存入組表。用於排序的維度欄位順序非常關鍵,要將重複度高的維度排在前面。
本例的維度包括:department_id,job_num,employee_id,begin_date,customer_id。其中,部門編號 department_id 總數最少(事實表中只出現 11 個部門),所以重複度最高。其他欄位中,job_num,employee_id,begin_date,customer_id 重複度依次降低。
同時,考慮實際應用中,分組欄位出現的情況也和重複度基本一致,所以排序的欄位順序可以確定為:department_id,job_num,employee_id,begin_date,customer_id。
我們用資料庫來做排序。示例如下:
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。
執行結果如圖:
根據以上要求改寫 etl.dfx,從資料庫中取出排序資料,型別轉化後,生成組表文件,儲存基礎寬表。程式碼示例如下:
其中:A2 的 SQL 語句增加了排序,A6 的組表指定了排序欄位。
其他程式碼和上期一致。
資料量為一億,匯出組表文件和前幾期的組表文件比較如下:
從上表可以看出,完成資料型別最佳化之後,檔案大小減少了14%(0.5GB)。再完成維度排序壓縮後,又減少了 20%(0.6GB), 總體減少 31%(1.1GB)。檔案變小,能減少磁碟讀取資料量,有效提高效能。
訪問寬表訪問寬表的 SPL 程式碼、Java 程式碼和上期相比沒有變化。
Java 程式碼加上後臺計算返回結果總的執行時間,和前期比較如下:
透過上表的對比可以看出,維度排序壓縮排一步提高了計算效能。
新增資料客戶表每天都會有新增資料,需要每天定時新增到組表文件中。如果是按日期有序的組表文件,將每天產生的新資料追加到檔案的最後即可。但是我們的客戶組表是按照部門等欄位有序的,如果在結尾直接追加資料,就不是整體有序了。如果每天都將原有資料和新資料一起重新排序,計算的時間會比較長。
我們可以從資料庫中讀取新資料並按照部門等欄位排序,再用 T.append@a() 函式追加,集算器會自動新建一個補檔案,每天新資料都有序歸併到補檔案中,補檔案相對較小,有序歸併耗時較短。每月只需對客戶表文件和補檔案重整一次,將補檔案有序歸併到組表文件中。
採用這個方法,編寫 etlAppend.dfx,網格引數如下:
SPL 程式碼如下:
A1:判斷輸入日期是否是每月第一天,如果是,就執行 B1 對客戶組表進行重整,將新資料形成的補檔案有序歸併進入客戶組表文件。
A2:連線 oracle 資料庫。
A3:取出當天資料。
A4:取出 jobs 表資料,用於型別轉換。
A5、B5、A6 與上期 etl.dfx 相同。
A7:將今天新增資料有序歸併到補檔案中。
A8:關閉檔案和資料庫連線。
etlAppend.dfx 需要每天定時執行。執行的方法是用 ETL 工具或者作業系統定時任務,透過命令列呼叫集算器指令碼。
例如: