GaussDB(DWS)《通過JDBC,實現遠程COPY導入數據到DWS》

      網友投稿 853 2025-04-01

      通過JDBC,實現遠程COPY導入數據到DWS

      1???? ??前言

      DWS云數倉的用戶,因為業務需要或者進行如TPC-DS等模型性能摸底時。存在從文件導入大量數據到DWS,或從DWS導出數據到ECS上的數據文件的使用需求。DWS云數倉支持JDBC的遠程連接,并且管理界面提供DWS數倉對應JDBC驅動的下載。用戶僅需下載對應DWS版本的驅動,和java源碼同時上傳到ECS,進行編譯打包后,即可通過JDBC實現COPY導入或者導出。如果用shell對JDBC調用進行二次封裝,可以更進一步簡化使用步驟,降低維護成本。

      當然,JDBC接口不限于COPY的執行,任何DWS支持的sql語法都可執行。本文以最常用的COPY作為實例,詳細描述JDBC使用每一步的實現和注意事項。

      長篇大論前,先給出整體思路的流程圖,讓大家擁有共同的邏輯基礎,方便對后續環節的理解。

      2?? ??必要文件上傳ECS,及ECS上JAVA JDK檢查

      2.1????? 上傳必要文件到ECS目錄

      root用戶在ECS創建目錄dws_copy, mkdir /data1/dws_copy

      root用戶上傳java源碼和JDBC驅動jar包到ECS的/data1/dws_copy目錄

      Copy.java源碼如下,

      import java.io.FileInputStream;

      import java.io.FileOutputStream;

      import java.io.IOException;

      import java.sql.Connection;

      import java.sql.DriverManager;

      import java.sql.SQLException;

      import org.postgresql.copy.CopyManager;

      import org.postgresql.core.BaseConnection;

      public class Copy {

      public Copy() {

      }

      public static void main(String[] args) {

      if (args.length != 9) {

      System.out.println("arguments number is not right");

      System.out.println("we need hostname port user password in|out database table file delimiter");

      } else {

      String hostname = args[0];

      String port = args[1];

      String username = args[2];

      String password = args[3];

      String action = args[4];

      String dataBase = args[5];

      String tableName = args[6];

      String file = args[7];

      String delimiter = args[8];

      String urls = new String("jdbc:postgresql://" + hostname + ":" + port + "/" + dataBase);

      String driver = "org.postgresql.Driver";

      Connection conn = null;

      try {

      Class.forName(driver);

      conn = DriverManager.getConnection(urls, username, password);

      } catch (ClassNotFoundException var18) {

      var18.printStackTrace(System.out);

      } catch (SQLException var19) {

      var19.getSQLState();

      var19.printStackTrace(System.out);

      }

      if (action.equals("out")) {

      try {

      copyToFile(conn, file, tableName, delimiter);

      } catch (SQLException var16) {

      var16.printStackTrace();

      } catch (IOException var17) {

      var17.printStackTrace();

      }

      } else if (action.equals("in")) {

      try {

      copyFromFile(conn, file, tableName, delimiter);

      } catch (SQLException var14) {

      var14.printStackTrace();

      } catch (IOException var15) {

      var15.printStackTrace();

      }

      } else {

      System.out.println("please input the corrent action ,in or out");

      }

      }

      }

      public static void copyFromFile(Connection connection, String filePath, String tableName, String delimiter) throws SQLException, IOException {

      FileInputStream fileInputStream = null;

      try {

      CopyManager copyManager = new CopyManager((BaseConnection)connection);

      fileInputStream = new FileInputStream(filePath);

      copyManager.copyIn("COPY " + tableName + " FROM STDIN DELIMITER '" + delimiter + "'", fileInputStream);

      } finally {

      if (fileInputStream != null) {

      try {

      fileInputStream.close();

      } catch (IOException var11) {

      var11.printStackTrace();

      }

      }

      }

      }

      public static void copyToFile(Connection connection, String filePath, String tableOrQuery, String delimiter) throws SQLException, IOException {

      FileOutputStream fileOutputStream = null;

      try {

      CopyManager copyManager = new CopyManager((BaseConnection)connection);

      fileOutputStream = new FileOutputStream(filePath);

      copyManager.copyOut("COPY " + tableOrQuery + " TO STDOUT DELIMITER '" + delimiter + "'", fileOutputStream);

      } finally {

      if (fileOutputStream != null) {

      try {

      fileOutputStream.close();

      } catch (IOException var11) {

      var11.printStackTrace();

      }

      }

      }

      }

      }

      注1:代碼中,String urls = new String("jdbc:postgresql://" + hostname + ":" + port + "/" + dataBase) 代碼段

      是DWS集群的JDBC連接字符串,可以從管理面的集群連接頁獲取具體對應的字符串;

      注2:以上代碼主要包括參數校驗和copy功能實現兩部分,更多開發信息,請參考華為云官網文檔JDBC開發章節,https://support.huaweicloud.com/devg2-dws/dws_0402_0065.html;

      創建目錄/data1/data_file,上傳或生成用于copy的數據文件

      2.2????? 檢查部署ECS java jdk

      root用戶,在ECS上執行java –version;javac –version;jar –version;

      檢查java JDK

      若有缺少的JDK組件,請自行下載部署

      3?? ??制作可執行jar包并進行shell二次封裝

      進入/data1/dws_copy目錄,編譯java源碼,javac Copy.class –cp driver.jar

      進入/data1/dws_copy目錄,打包java源碼為jar包,

      2.1,編寫保存manifest文件:

      Manifest-Version: 1.0

      Main-Class: Copy

      Class-Path: [JDBC驅動jar包名稱]

      注:manifest文件中, ’:’后有一個空格

      生成jar包jar, jar cvfm Copy.jar manifest ./Copy.class ./manifest

      java –jar執行時,需要大量的入參,命令長且不易維護。固使用shell對java –jar命令執行進行二次封裝,達到簡化執行和維護的目的(入參寫到到配置文件讀取執行)。

      示例shell腳本run_jdbc_copy.sh代碼如下,主要用于單表或多表并發COPY ECS上本地文件的數據到DWS集群內的表中,用戶可以根據自己的需求,自行設計

      #!/bin/bash

      script_path=$(cd `dirname

      script_path=$(cd `dirname $0`;pwd)

      `;pwd)

      source ${script_path}/jdbc_copy.conf

      function usage()

      {

      echo "This srcipt is used to copy tpch/tpcds data to remote database.Before running the script,u must configured the file: jdbc_copy.conf."

      echo -e " "

      echo "u can run the script as following:"

      echo -e " "

      echo "? 1.copy data in batch mode: sh run_jdbc_copy.sh batch"

      echo -e " "

      echo "? 2.copy data in single mode: sh run_jdbc_copy.sh single [tablename]"

      }

      function batch_copy()

      {

      echo "[INFO]: Batch mode copying data to ${remote_ip} database ${db_name} by JDBC started."

      for t in `cat ${table_list}`

      do

      table_name=`echo "${t}"|awk -F '.' {'print'}`

      echo "[INFO]: Copying data to ${table_name}."

      java -jar ${script_path}/Copy.jar ${remote_ip} ${db_port} ${db_user} ${user_passwd} in ${db_name} ${table_name} ${data_abs_path}/${t} "|" > /dev/null 2>&1

      if [ $? -eq 0 ]

      then? echo "[INFO]: Successfully copied data to ${table_name}."

      else

      echo "[WARNIG]: Something unexpected happened.plz using single mode to check."

      fi

      done

      echo "[INFO]: Batch mode copyed data to ${remote_ip} database ${db_name} by JDBC done."

      }

      function single_copy()

      {

      echo "[INFO]: Single mode copying data to ${remote_ip} database ${db_name} by JDBC started."

      java -jar ${script_path}/Copy.jar ${remote_ip} ${db_port} ${db_user} ${user_passwd} in ${db_name} ${data_abs_path}/.* "|"

      echo "[INFO]: Single mode copyed data to done."

      }

      case in

      batch)batch_copy;;

      single)single_copy ;;

      *)echo "[ERROR]: Invalid para.";usage;;

      esac

      注:其中jdbc_copy.conf配置文件,內容如下:

      remote_ip=192.168.xxx.xxx? (dws集群連接域名或內網IP)

      db_port=8000? (C連接端口號)

      db_user=user? (數據庫用戶)

      user_passwd=passwd? (數據庫用戶密碼)

      db_name=gaussdb? (連接的目標數據庫名稱)

      data_abs_path=/data1/data_file/? (Copy from數據文件的本地路徑)

      delimiter="|"? (讀取數據文件的分隔符)

      table_list="/data1/dws_copy/table.lst"? (要執行copy的目標表清單,格式為每行schema.tablename)

      4?? ??執行shell,通過JDCB實現COPY功能

      4.1????? 執行shell,實現從ECS對DWS集群的Copy操作

      root用戶,

      cd /data1/dws_copy;

      copy數據到單張表:

      sh run_jdbc_copy.sh single_copy ss.col_t

      copy數據到多張表:

      添加如下到/data1/dws_copy/table.lst,

      ss.t1

      GaussDB(DWS)《通過JDBC,實現遠程COPY導入數據到DWS》

      ss.t2

      ss.t3

      保存后執行,

      sh run_jdbc_copy.sh batch_copy

      EI企業智能 Gauss AP JDBC 數據倉庫服務 GaussDB(DWS)

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Qt QSerialPort ReadAll() 報錯 串口讀取錯誤,非法內存,及小項目開發感悟
      下一篇:Excel函數與公式綜合應用技巧
      相關文章
      亚洲熟妇无码一区二区三区导航| 亚洲一区在线免费观看| 亚洲一区在线视频观看| 久久久亚洲精品国产| 亚洲国产精品一区第二页| 亚洲熟妇无码乱子AV电影| 亚洲人精品午夜射精日韩| 亚洲一区AV无码少妇电影☆| 亚洲午夜国产精品无码| 伊人婷婷综合缴情亚洲五月| 久久亚洲2019中文字幕| 国产亚洲一区二区三区在线观看| 亚洲一级片内射网站在线观看| 少妇亚洲免费精品| 亚洲国产成人久久综合野外| 亚洲VA综合VA国产产VA中| 国产精品V亚洲精品V日韩精品| 亚洲伊人久久成综合人影院| 怡红院亚洲怡红院首页| 精品国产亚洲一区二区三区| 久久青青草原亚洲AV无码麻豆| 亚洲国产高清视频| 亚洲色图校园春色| 成人亚洲国产va天堂| 亚洲AV无码精品国产成人| 成人亚洲网站www在线观看 | 亚洲欧洲国产综合| 亚洲天天做日日做天天欢毛片| 亚洲第一视频网站| 亚洲激情黄色小说| 久久亚洲国产成人影院| 亚洲国产成人手机在线观看| 偷自拍亚洲视频在线观看| 国产精品亚洲不卡一区二区三区| 亚洲精品色午夜无码专区日韩| 久久综合图区亚洲综合图区| 亚洲网红精品大秀在线观看| 2020国产精品亚洲综合网 | 亚洲熟女一区二区三区| 久久精品国产亚洲AV电影| 亚洲专区一路线二|