資料抽取平臺pydatax,前期專案做過介紹:
1,資料抽取平臺pydatax介紹--實現和專案使用
專案2: 客戶有9個分公司,用的ERP有9套,有9個庫,不同版本,抽取的同一個表欄位長度有不一樣,欄位可能有多有少,客戶ERP核心分公司ERP幾個月後有大版本升級。
在2023年12月,當時做這個抽取時,客戶只是做一個分公司的,抽取9套其中的一套ERP的Oracle庫,當時考慮是否把這9個庫的都抽取了,免得後面客戶要做,浪費時間再做一遍,太麻煩,問了專案負責人也沒說是要把這9個庫都抽取過來,沒說要做! 到底怎麼處理?
想想早晚要做,還是先都抽取了,把他的8家公司的Oracle資料庫都抽取過來,各個公司的資料,9張表合併成1張,在表加租戶id欄位區分:tenant_id 確定是那個公司的,把這個大資料抽取,資料指標計算完成。
到了2024年7月份,客戶突然說後續指標計算暫停,要把其他的子公司的資料和計算也加進去,這半年又新參股合併了3家公司,原先有一家去掉。一共要新加7+3=10家公司,為支援該業務需要,pydatax的修改過程如下:
1,JSON抽取模板修改
oracle_gp_table_df_job.json檔案加上新加的3個分公司,再原有的json去掉一家公司:
{ "querySql": [ "select SYSdate as etl_create_time,SYSdate as etl_update_time, 'wflsy' as tenant_id,${src_table_columns_wflsy} from wflsy.${src_table_name} ${relation} where ${condition}" ], "jdbcUrl": [ "jdbc:oracle:thin:@10.0.1.206:1521:erp"] }, { "querySql": [ "select SYSdate as etl_create_time,SYSdate as etl_update_time, 'ky' as tenant_id, ${src_table_columns_ky} from ky.${src_table_name} ${relation} where ${condition}" ], "jdbcUrl": [ "jdbc:oracle:thin:@10.0.1.206:1521:erp"] }, { "querySql": [ "select SYSdate as etl_create_time,SYSdate as etl_update_time, 'wfjy' as tenant_id, ${src_table_columns_wfjy} from wfjy.${src_table_name} ${relation} where ${condition}" ], "jdbcUrl": [ "jdbc:oracle:thin:@10.0.1.206:1521:erp"] },
2,Python程式修改
以上加上後,同時要在pydatax.py和vprepair.py的指令碼上加上3個變數,傳遞給datax的json模板, 這樣每天抽取任務的全量和增量3家新公司資料生效。
src_table_columns_wflsy=get_org_src_columns(src_table_columns,"WFLSY",src_table_name)
src_table_columns_ky=get_org_src_columns(src_table_columns,"KY",src_table_name)
src_table_columns_wfjy=get_org_src_columns(src_table_columns,"WFJY",src_table_name)
" -Dsrc_table_columns_std='" + src_table_columns_std + "' " \ " -Dsrc_table_columns_ky='" + src_table_columns_ky + "' " \ " -Dsrc_table_columns_wflsy='" + src_table_columns_wflsy + "' " \ " -Dsrc_table_columns_wfjy='" + src_table_columns_wfjy + "' " \ " -Ddes_table_columns='"+des_table_columns+"' \" "
這樣整個每天11家公司的表全量資料和表增量資料就正常的,全量同步的表資料是每天全量,不用處理,但增量表歷史資料怎麼抽取過來?
3,增量表歷史資料處理
1,將1中的3個Json單獨編寫成1個json模板,模板的"preSql"中的“truncate table 表“ 資料不再使用。
2,新模板json檔案放到對應資料夾下,寫一條資料到datax_json中
3,是增量的歷史表datax_config的資料copy一份到datax_config_repair中,並將json_id和2中的一致,只按2的新模板抽取資料
4,執行vprepair.py後,資料同步到臨時表stg表,再執行select sp_stg();
4, 特殊表處理
商品表,有家公司的商品表,同一個商品有多個,直接抽取商品表,會在該公司有多條資料,客戶做了個檢視過濾成1條,說抽取這個檢視資料就可以,但pydatax的11個庫的表名要必須一致,怎麼處理?
想想也可以實現,就是對這個商品表單獨配置一個抽取JSON模板,如下:dbo.base_${src_table_name} ,當然也可以把這個表名寫死,也可以使用。在datax_config表的json_id配置成新的模板,就可以實現單獨表的特殊處理。
"querySql": [ "select SYSdate as etl_create_time,SYSdate as etl_update_time, 'zb' as tenant_id,${src_table_columns} from dbo.base_${src_table_name} ${relation} where ${condition}" ], "jdbcUrl": [ "jdbc:oracle:thin:@192.168.0.17:1521/erpdg"] },
修改的檔案放在壓縮包的”11庫抽取”資料夾下:
pydatax原始碼下載地址:
1,https://files.cnblogs.com/files/zping/pydatax.rar
總結:
1,pydatax的靈活性在此專案得到很好的驗證
2,其簡單的修改就可以快速滿足客戶的需求