數據抽取平臺pydatax介紹--實現和項目使用

   數據抽取平臺pydatax實現過程中,有2個關鍵點:

    1、是否能在python3中調用執行datax任務,自己測試了一下可以,代碼如下:
    這個str1就是配置的shell文件     

try:
   result = os.popen(str1).read()
except Exception as e:
  print(e)

  2、是否能獲取datax執行後的信息:用來捕獲執行的情況和錯誤信息

         上面執行後的result就包含了datax的執行信息,對信息進行篩選,就可以獲得

   pydatax的表設計 

        在上面的2個關鍵點解決後,其他問題就比較簡單,設計相關的表:

datax_config   datax抽取表的模板配置(源表名,目標表名,模板id,抽取的字段,抽取條件(增量,全量,特殊),抽取時間,執行順序等)
datax_config_repair   datax的出錯修復表,結構和datax_config一樣,用於datax出錯後,修復數據用
datax_etl_error    datax的etl的報錯信息(非異常字符的報錯)
datax_json   datax的模板id配置(全量和增量2個模板文件名)
datax_log   datax運行抽取表的執行信息(是否執行完成,抽取行數,速度,讀出行數,流量等)
datax_row_error  datax執行中,字段有異常字符的報錯信息

 pydatax在項目中使用

       項目1: 直接配置datax的模板json,從oracle 11g抽取到postgresql中,

                     因postgresql中會對"0x"這些異常字符報錯,如oracle中字段有這樣字段,必須在抽取字段使用:

                    使用 replace(name,chr(0),'\'\'') as name 來代替 以前的字段 name

       項目2: 客戶有9個分公司,用的ERP有9套,有9個庫,不同版本,抽取的同一個表字段長度有不一樣,字段可能有多有少,客戶ERP核心分公司ERP幾個月後有大版本升級。

                     因項目2中:數據倉庫使用的GreePlum,datax的驅動用的是gpdbwriter-v1.0.4-hashdata.jar,該驅動自動刪除"0x"非法字符,就不存在該錯誤

                     不可能寫9個抽取json模板,再抽取,只能原有json模板上修改

                     字段長度不同: 取9個庫的最大值,作爲目標表字段的字段長度

                     字段個數不同:   取其一個核心分公司庫表爲基礎建表,其他8個庫表,如果有就保留,沒有就字段數據爲NULL,每次執行查詢取出8個庫的字段:                         

# 獲取分公司庫該表的字段,如對比核心庫表字段的缺失,使用null as 字段替換,如果多餘則廢棄,
# 字段對比以核心庫爲標準
def get_org_src_columns(src_columns,org_name,tab_name):
    src_columns = src_columns
    # 分公司字段
    org_cols = get_org_cols(org_name,tab_name)
    lst = src_columns.split(",")
    cols1 = (org_cols + ',')
    src_columns1 = (src_columns + ',')
    for i in lst:
      str1 =i.strip() + ','  # 去掉空格,對比使用,字段名+',',這樣避免有重複前綴的字段名,導致誤判
      if (cols1.find(str(','+str1)) == -1):
        src_columns1 = src_columns1.replace(str(','+str1), ',NULL as ' + str1)
    return src_columns1.rstrip(',')

# 獲取分公司庫的表的字段用','合併成一個字符串
def get_org_cols(org_name,tab_name):
    conn = ora_conn()
    cur = conn.cursor()
    cols=""
    sql="select WM_CONCAT(COLUMN_NAME) cols from (SELECT  COLUMN_NAME FROM  all_tab_columns WHERE OWNER=upper('"+org_name+"') " \
        "and  table_name =upper('"+tab_name+"') order by COLUMN_ID asc) t ";
    cur.execute(sql)
    datas = cur.fetchall()
    for row in datas:
      cols= str(row[0])
    return cols;

       修改json模板支持同時抽取9個數據庫,修改的9個庫同時抽取oracle數據到greeplum全量json模板,見下載文件的:oracle_gp_table_df_job.json:  

    src_table_columns=row.get("src_table_column")
    # 其他8家分公司庫
    src_table_columns_fz=get_org_src_columns(src_table_columns,"FZ",src_table_name)
    src_table_columns_jcg=get_org_src_columns(src_table_columns,"JCG",src_table_name)
    src_table_columns_ks=get_org_src_columns(src_table_columns,"KS",src_table_name)
    src_table_columns_qzdf=get_org_src_columns(src_table_columns,"QZDF",src_table_name)
    src_table_columns_sdsht=get_org_src_columns(src_table_columns,"SDSHT",src_table_name)
    src_table_columns_wfjx=get_org_src_columns(src_table_columns,"WFJX",src_table_name)
    src_table_columns_wst=get_org_src_columns(src_table_columns,"WST",src_table_name)
    src_table_columns_std=get_org_src_columns(src_table_columns,"STD",src_table_name)


    str1 = "/usr/bin/python /opt/module/datax/bin/datax.py /opt/module/datax/job/json/"+etl_mode+" -p  \" " \
           " -Dsrc_table_name='"+src_table_name+"' " \
           " -Ddes_table_name='"+des_table_name+"' " \
           " -Dsplit_pk_field='"+split_pk_field+"'   " \
           " -Drelation='"+relation+"' " \
           " -Dcondition='"+dcondition+"' " \
           " -Dsrc_table_columns='"+src_table_columns+"' " \
           " -Dsrc_table_columns_fz='" + src_table_columns_fz + "' " \
           " -Dsrc_table_columns_jcg='" + src_table_columns_jcg + "' " \
           " -Dsrc_table_columns_ks='" + src_table_columns_ks + "' " \
           " -Dsrc_table_columns_qzdf='" + src_table_columns_qzdf + "' " \
           " -Dsrc_table_columns_sdsht='" + src_table_columns_sdsht + "' " \
           " -Dsrc_table_columns_wfjx='" + src_table_columns_wfjx + "' " \
           " -Dsrc_table_columns_wst='" + src_table_columns_wst + "' " \
           " -Dsrc_table_columns_std='" + src_table_columns_std + "' " \
           " -Ddes_table_columns='"+des_table_columns+"' \" "

      這樣修改後,就可以同時抽取9個庫的數據,同時配置時,只需要配置核心庫的相關字段等數據即可!  

      說明: 1,該平臺沒有可視化頁面的後臺管理系統,如果加上後臺管理系統,就更完美,但目前是足夠使用的!

      DATAX的GreePlum驅動plugin下載:  

                  https://files.cnblogs.com/files/zping/gpdbwriter.rar?t=1708999240&download=true

     pydatax源碼下載地址:

                 https://files.cnblogs.com/files/zping/pydatax.rar?t=1708755764&download=true

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章