sqoop如何指定pg庫的模式

華為雲開發者社群發表於2022-01-22
摘要:sqoop如何指定pg庫的模式?

本文分享自華為雲社群《【Hadoop】關於Sqoop匯出資料到postgresql時schema的設定問題》,作者:Copy工程師 。

說明

使用sqoop匯出匯入資料非常的方便,但是對於postgresql(簡稱PG庫)時就碰到了一個問題,pg庫是三層結構的database——schema——table。如果想匯入到某一個模式下,那就需要指定模式才可以。但是sqoop如何指定pg庫的模式?

解決辦法

碰到問題首先要看文件才對的。文件這裡已經指出如何指定pg庫的schema了。官方文件地址
文件已經說了,如果向指定schema需要新增-- --schema <name> 但是要注意的是必須在命令列的 !!!!最後!!! 新增才會生效。

sqoop如何指定pg庫的模式

但是,這是命令列的解決辦法,如果我們使用的是java呢?在沒解決之前,我的java程式碼是這樣寫的:

public static boolean ExportCmdInPg(Configuration conf, String tableName, List<String> columns, String hdfsDir,Map<String, String> dbMap) {
        try {
            LogUtils.logInfoPrint("開始任務",logger);
            List<String> list = new ArrayList<>();
            list.add("--connect");
            list.add(dbMap.get(Constant.DRIVERURL));
            list.add("--username");
            list.add(dbMap.get(Constant.USER));
            list.add("--password");
            list.add(dbMap.get(Constant.PASSWORD));
            list.add("--table");
            list.add(tableName);
            list.add("--columns");
            list.add(StringUtils.join(columns, ','));
            list.add("--fields-terminated-by");
            list.add("\t");
            list.add("--export-dir");
            list.add(hdfsDir);
            list.add("-m");
            list.add("1");
            ExportTool exporter = new ExportTool();
            Sqoop sqoop = new Sqoop(exporter);
            String[] data = list.toArray(new String[0]);
            if (0 == data.length) {
                LogUtils.logErrorPrint("sqoop引數為空,請檢查ExportCmd方法!",logger);
                return false;
            }
            if (0 == Sqoop.runSqoop(sqoop, data)){
                return true;
            }
        }catch (Exception e){
            LogUtils.logErrorPrint("ExportCmd 匯入到HDFS出現錯誤",logger,e);
        }
        return false;
    }

結果當然是不成功。那我哦新增-- --schema 引數試一下

public static boolean ExportCmdInPg(Configuration conf, String tableName, List<String> columns, String hdfsDir,Map<String, String> dbMap) {
        try {
            LogUtils.logInfoPrint("開始任務",logger);
            List<String> list = new ArrayList<>();
            list.add("--connect");
            list.add(dbMap.get(Constant.DRIVERURL));
            list.add("--username");
            list.add(dbMap.get(Constant.USER));
            list.add("--password");
            list.add(dbMap.get(Constant.PASSWORD));
            list.add("--table");
            list.add(tableName);
            list.add("--columns");
            list.add(StringUtils.join(columns, ','));
            list.add("--fields-terminated-by");
            list.add("\t");
            list.add("--export-dir");
            list.add(hdfsDir);
            list.add("-m");
            list.add("1");
            list.add("-- --schema");
            list.add("HERO");
            ExportTool exporter = new ExportTool();
            Sqoop sqoop = new Sqoop(exporter);
            String[] data = list.toArray(new String[0]);
            if (0 == data.length) {
                LogUtils.logErrorPrint("sqoop引數為空,請檢查ExportCmd方法!",logger);
                return false;
            }
            if (0 == Sqoop.runSqoop(sqoop, data)){
                return true;
            }
        }catch (Exception e){
            LogUtils.logErrorPrint("ExportCmd 匯入到HDFS出現錯誤",logger,e);
        }
        return false;
    }

結果也是不成功,顯示報錯不識別-- --schema 。。。為了能夠使schema引數生效,廢了我不少勁。。。也查了不少資料,但是查到的資料都沒有關於java的schema的設定。所以。。。最終正確的解決辦法是:

public static boolean ExportCmdInPg(Configuration conf, String tableName, List<String> columns, String hdfsDir,Map<String, String> dbMap) {
        try {
            LogUtils.logInfoPrint("開始sqoop將oracle的資料匯出到HDFS目錄",logger);
            List<String> list = new ArrayList<>();
            list.add("--connect");
            list.add(dbMap.get(Constant.DRIVERURL));
            list.add("--username");
            list.add(dbMap.get(Constant.USER));
            list.add("--password");
            list.add(dbMap.get(Constant.PASSWORD));
            list.add("--table");
            list.add(tableName);
            list.add("--columns");
            list.add(StringUtils.join(columns, ','));
            list.add("--fields-terminated-by");
            list.add("\t");
            list.add("--export-dir");
            list.add(hdfsDir);
            list.add("-m");
            list.add("1");
            // 注意這裡是--是分開的,原始碼這裡是通過--做判斷的
            list.add("--");
            list.add("--schema");
            list.add("HERO");
            ExportTool exporter = new ExportTool();
            Sqoop sqoop = new Sqoop(exporter);
            String[] data = list.toArray(new String[0]);
            if (0 == data.length) {
                LogUtils.logErrorPrint("sqoop引數為空,請檢查ExportCmd方法!",logger);
                return false;
            }
            if (0 == Sqoop.runSqoop(sqoop, data)){
                return true;
            }
        }catch (Exception e){
            LogUtils.logErrorPrint("ExportCmd 匯入到HDFS出現錯誤",logger,e);
        }
        return false;
    }

當然你也可能會使用字串陣列,陣列方式就要這樣寫了

// 這裡只是舉個示例
String[] string = new String[]{"--","--schema","HERO"}

so 問題解決,心情愉快。如果問題不解決,可能會憋一天。。。。

 

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章