sqoop如何指定pg庫的模式(方法詳解)
sqoop是一款用于hadoop和關(guān)系型數(shù)據(jù)庫之間數(shù)據(jù)導入導出的工具。你可以通過sqoop把數(shù)據(jù)從數(shù)據(jù)庫(比如mysql,oracle)導入到hdfs中;也可以把數(shù)據(jù)從hdfs中導出到關(guān)系型數(shù)據(jù)庫中。sqoop通過Hadoop的MapReduce導入導出,因此提供了很高的并行性能以及良好的容錯性。

sqoop適合以下的人群使用:
- 系統(tǒng)和應用開發(fā)者
- 系統(tǒng)管理員
- 數(shù)據(jù)庫管理員
- 數(shù)據(jù)分析師
- 數(shù)據(jù)工程師
說明
使用sqoop導出導入數(shù)據(jù)非常的方便,但是對于postgresql(簡稱PG庫)時就碰到了一個問題,pg庫是三層結(jié)構(gòu)的database——schema——table。如果想導入到某一個模式下,那就需要指定模式才可以。但是sqoop如何指定pg庫的模式?
解決辦法
碰到問題首先要看文檔才對的。文檔這里已經(jīng)指出如何指定pg庫的schema了。官方文檔地址
文檔已經(jīng)說了,如果向指定schema需要添加-- --schema <name> 但是要注意的是必須在命令行的?。。?!最后?。?!添加才會生效。

但是,這是命令行的解決辦法,如果我們使用的是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參數(shù)為空,請檢查ExportCmd方法!",logger);
return false;
}
if (0 == Sqoop.runSqoop(sqoop, data)){
return true;
}
}catch (Exception e){
LogUtils.logErrorPrint("ExportCmd 導入到HDFS出現(xiàn)錯誤",logger,e);
}
return false;
}結(jié)果當然是不成功。那我哦添加-- --schema 參數(shù)試一下
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參數(shù)為空,請檢查ExportCmd方法!",logger);
return false;
}
if (0 == Sqoop.runSqoop(sqoop, data)){
return true;
}
}catch (Exception e){
LogUtils.logErrorPrint("ExportCmd 導入到HDFS出現(xiàn)錯誤",logger,e);
}
return false;
}結(jié)果也是不成功,顯示報錯不識別-- --schema 。。。為了能夠使schema參數(shù)生效,廢了我不少勁。。。也查了不少資料,但是查到的資料都沒有關(guān)于java的schema的設置。所以。。。最終正確的解決辦法是:
public static boolean ExportCmdInPg(Configuration conf, String tableName, List<String> columns, String hdfsDir,Map<String, String> dbMap) {
try {
LogUtils.logInfoPrint("開始sqoop將oracle的數(shù)據(jù)導出到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參數(shù)為空,請檢查ExportCmd方法!",logger);
return false;
}
if (0 == Sqoop.runSqoop(sqoop, data)){
return true;
}
}catch (Exception e){
LogUtils.logErrorPrint("ExportCmd 導入到HDFS出現(xiàn)錯誤",logger,e);
}
return false;
}當然你也可能會使用字符串數(shù)組,數(shù)組方式就要這樣寫了
// 這里只是舉個示例
String[] string = new String[]{"--","--schema","HERO"}so 問題解決,心情愉快。如果問題不解決,可能會憋一天。。。。
本文分享自華為云社區(qū)《【Hadoop】關(guān)于Sqoop導出數(shù)據(jù)到postgresql時schema的設置問題》,作者:Copy工程師 。
到此這篇關(guān)于sqoop如何指定pg庫的模式的文章就介紹到這了,更多相關(guān)sqoop指定pg庫的模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決IDEA中g(shù)it拉取代碼時出現(xiàn)Update canceled問題
這篇文章主要介紹了解決IDEA中g(shù)it拉取代碼時出現(xiàn)Update canceled問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07

