windows下kettle使用gpload加載數據到greenplum

使用gpload需要先安裝幾個軟件,安裝順序是

python-2.5.4.msi
PyYAML-3.05.win32-py2.5.exe
PyGreSQL-4.1.1.win-amd64-py2.5.msi
PyGreSQL-4.1.1.win-amd64-py2.5.exe
greenplum-loaders-4.3.26.0-WinXP-x86_32.msi

python必須是2.5.4版本,因爲gpload的windows版使用的是2.5.4,不然可能會出現奇怪的錯誤,2、3、4安裝的軟件需下載跟python對應的版本

使用gpload需保證gpdb服務器與ETL服務器ping互通

下面是kettle裏gpload的使用

gpload依賴gpfdist,使用前需先啓動gpfdist,在greenplum-loaders安裝目錄/bin下有個gpfdist.exe,雙擊即可

這裏寫圖片描述

 load method有兩個選項,Automatic load (at the end)代表自動執行gpload加載數據;Manual load (only creation of files)代表手動執行,只生成cfg,dat文件,需要手動執行gpload命令;cfg文件是gpload的yml文件,dat是需要加載的數據文件

 erase cfg/dat files after use這個選擇是指使用後是否刪除cfg,dat文件

load action(加載方式):insert(插入),update(更新),merge(合併,存在更新,不存在則插入),update和merge需要在字段列表中至少存在一個字段match爲true,用戶匹配更新的字段,match列後面還有一個update列,設爲true表示遇到更新的記錄行更新該字段。
注意:kettle裏面的gpload字段的match和update好像設置無效,改爲“是”保存在打開又變成了“否”,導致無法增量更新。本人目前解決方案是:直接修改轉換文件,找到字段映射那塊,手動修改爲Y,暫時解決問題,可增量更新。

這裏寫圖片描述

local host配置:port爲gpfdist使用的端口,host爲gpfdist的ip,不要使用127.0.0.1,使用的ip必須得greenplum庫能ping通,port建議不設置,默認會在8000-9000選取可用端口,如果設置了port,需保證gpload並行執行時使用的端口不同,不然會端口衝突,導致失敗。

這裏寫圖片描述

GP Configuration (使用gpload的一些配置):

path to the gpload :D:\Program Files (x86)\Greenplum\greenplum-loaders-4.3.26.0\bin\python.py
control file :生成cfg文件保存的地址及control文件名
error table:加載出現錯誤的數據,填寫了會自動在gp庫中創建改表,加載錯誤的數據會存到改表中
log file :gpload運行日誌
data file :生成的dat數據文件地址及dat文件名
Null as:null值替換
encoding:編碼
max errors:允許錯誤數量
delimiter:數據字段列分隔符,建議使用一些特殊的字段,避免數據中存在該字符,倒是加載數據出現錯誤,或在執行gpload之前將數據中的特殊字符替換掉

kettle gpload常見錯誤:

1、missing data for column "xxx",這種錯誤如果數據導出沒有問題,一般是由於數據中含有分隔符,或數據中含有轉義字符,將分隔符轉義導致。
2、gpload並行導入失敗,單個導入成功,這個問題一般是gpfdist端口衝突了,並行的gpload任務gpfdist端口不能一樣,建議gpload裏面的端口不要設置,默認會在8000-9000選擇可用端口,避免衝突。

kettle中使用gpload加載數據時,null as配置好像沒有作用,null值導入進去後變成了”(兩個單引號),查看gpload.py腳本發現這段代碼

if nullas != False: # could be empty string
        self.formatOpts += "null %s " % quote_no_slash(nullas)
    elif formatType=='csv':
        self.formatOpts += "null '' "
    else:
        self.formatOpts += "null %s " % quote_no_slash("\N")

 一般我們可能需要將null值替換成孔字符串,需要將self.formatOpts += "null %s " % quote_no_slash("\N")
 修改爲self.formatOpts += "null %s " % quote_no_slash("")

建議:

使用kettle環境變量,數據庫連接等需要區分環境的配置使用變量,可以做到一個環境一份配置,無需切換環境時更改。環境變量可在.kettle.propeties文件裏添加
數據裝在到gp庫前,先做一次字符集替換,將轉義符、跟分隔符相同的字符替換掉,避免加載數據失敗,下面附上js代碼。

 for (var i=0;i < getInputRowMeta().size();i++){
    var valueMeta= getInputRowMeta().getValueMeta(i);
    if (valueMeta.getTypeDesc().equals("String")) {
        var fStr= row[i];
        fStr=replace(row[i],'\n','');
        fStr=replace(fStr,'\r','');
        fStr=replace(fStr,'\t','');
        fStr=replace(fStr,'\b','');
        row[i]=fStr;
    }
}

這裏寫圖片描述

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