sqoop如何指定pg庫的模式(方法詳解)
sqoop是一款用於hadoop和關系型數據庫之間數據導入導出的工具。你可以通過sqoop把數據從數據庫(比如mysql,oracle)導入到hdfs中;也可以把數據從hdfs中導出到關系型數據庫中。sqoop通過Hadoop的MapReduce導入導出,因此提供瞭很高的並行性能以及良好的容錯性。
sqoop適合以下的人群使用:
- 系統和應用開發者
- 系統管理員
- 數據庫管理員
- 數據分析師
- 數據工程師
說明
使用sqoop導出導入數據非常的方便,但是對於postgresql(簡稱PG庫)時就碰到瞭一個問題,pg庫是三層結構的database——schema——table。如果想導入到某一個模式下,那就需要指定模式才可以。但是sqoop如何指定pg庫的模式?
解決辦法
碰到問題首先要看文檔才對的。文檔這裡已經指出如何指定pg庫的schema瞭。官方文檔地址
文檔已經說瞭,如果向指定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參數為空,請檢查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 問題解決,心情愉快。如果問題不解決,可能會憋一天。。。。
本文分享自華為雲社區《【Hadoop】關於Sqoop導出數據到postgresql時schema的設置問題》,作者:Copy工程師 。
到此這篇關於sqoop如何指定pg庫的模式的文章就介紹到這瞭,更多相關sqoop指定pg庫的模式內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- postgresql 實現數據的導入導出
- JSON Schema概念及使用場景
- Mysql查詢所有表和字段信息的方法
- Java DatabaseMetaData用法案例詳解
- @TableName註解和@Table的區別及說明