首頁>技術>

【摘要】

實踐目標

本期目標,是在完成資料型別轉化基礎上,實現維度排序壓縮,進一步提升計算速度。

實踐的步驟:

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 工具或者作業系統定時任務,透過命令列呼叫集算器指令碼。

例如:

9
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • ​Python 常用庫之 psutil 使用指南