Datax(27):あまり一般的な構成項目querySql、preSql、postSql、splitPk

16383 ワード

各dataxのjsonには自分のjson構成ドキュメントがあり、基本的には大同小異で、いくつかの構成が少ないが、使った後、真香~
一、querySql
1、チュートリアルの使用
  • の説明:一部のビジネスシーンでは、whereという構成項目はフィルタリングされた条件を説明するのに十分ではなく、ユーザーはこの構成によってSQLのフィルタリングをカスタマイズすることができる.ユーザーがこれを構成すると、DataXシステムはtable、columnなどの構成型を無視し、この構成項目の内容を直接使用してデータをフィルタリングします.例えば、マルチテーブルjoin後にデータを同期し、select a、b from table_を使用します.a join table_b on table_a.id = table_b.id querySql ,xxxReader table、column、where .querySqlが構成するtable,column,whereなどが構成されている場合、logには警告ログがあり、具体的なコードはOriginalConfPretreatmentUtilである.dealColumnConf()
  • ……
    if (null != userConfiguredColumns && userConfiguredColumns.size() > 0) {
         
            LOG.warn(
                "      .             querySql   ,           column.            ,             column.");
            originalConfig.remove(Key.COLUMN);
          }
    
          // querySql  ,      where,         
          String where = originalConfig.getString(Key.WHERE, null);
          if (StringUtils.isNotBlank(where)) {
         
            LOG.warn(
                "      .             querySql   ,           where.            ,             where.");
            originalConfig.remove(Key.WHERE);
          }
    
          // querySql  ,      splitPk,         
          String splitPk = originalConfig.getString(Key.SPLIT_PK, null);
          if (StringUtils.isNotBlank(splitPk)) {
         
            LOG.warn(
                "      .             querySql   ,           splitPk.            ,             splitPk.");
            originalConfig.remove(Key.SPLIT_PK);
          }
    
    ……
    
  • 必須:No
  • デフォルト:
  • なし
    2、現在使用可能なプラグイン
    現在は主にreaderプラグインで、主にrdbmsReader(sqlServer、mysql、postgresql、oracleなど)、hbase 20 xsqlreader、DrdsReader、KingbaseesReaderがあります.
    3、ソースコード解読
             CommonRdbmsReader startRead() 
    1.    String querySql = readerSliceConfig.getString(Key.QUERY_SQL);
    2.     rs = DBUtil.query(conn, querySql, fetchSize);
    
    DBUtil.query          :
      public static ResultSet query(Statement stmt, String sql)
          throws SQLException {
         
        return stmt.executeQuery(sql);
      }
    
    

    二、preSql
    1、チュートリアルの使用
  • 記述:データが宛先テーブルに書き込まれる前に、ここの標準文が先に実行されます.Sqlに操作するテーブル名がある場合は、@tableを使用してください.これにより、実際にSql文を実行するときに、変数が実際のテーブル名に置き換えられます.たとえば、宛先に書き込む100個の同性表(テーブル名:datax_00,datax 01,...datax_98,datax_99)を作成し、データをインポートする前にテーブル内のデータを削除するには、"preSql":["delete from "]を構成します.これは、各テーブルにデータを書き込む前に、対応するdelete from対応テーブル名
  • を実行することです.
  • 必須:No
  • デフォルト:
  • なし
    2、現在使用可能なプラグイン
    現在は主にwriterプラグインで、主にrdbmsWriter、mongodBWriter、AdsWriterなどがあります.
    3、ソースコード解読
       writer prepare  ,  CommonRdbmsWriter.prepare()  
    1.    preSqls 
            List<String> preSqls = originalConfig.getList(Key.PRE_SQL, String.class);
            List<String> renderedPreSqls = WriterUtil.renderPreOrPostSqls(preSqls, table);
    2.  preSqls
    WriterUtil.executeSqls(conn, renderedPreSqls, jdbcUrl, dataBaseType);
    

    三、postSql
    1、チュートリアルの使用
  • では、目的のテーブルにデータを書き込むと、ここでの標準文が実行されると説明されています.(原理同presql)
  • 必須:No
  • デフォルト:
  • なし
    2、現在使用可能なプラグイン
    ほとんどのwriterプラグイン
    3、ソースコード解読
    preSqlと同じで、余計な説明ではありません;
    四、splitPk
    1、チュートリアルの使用
  • 説明:データ抽出を行う場合、splitPkを指定すると、splitPkが表すフィールドを使用してデータのスライスを行いたいことを示すため、DataXはコンカレントタスクを起動してデータ同期を行い、データ同期の効率を大幅に向上させることができる.splitPkユーザーはテーブルプライマリ・キーを使用することをお勧めします.テーブル・プライマリ・キーは通常均一であるため、切り分けたスライスにもデータ・ホットスポットが現れにくいからです.現在splitPkは整形データの分割のみをサポートしており、 、 、 である.ユーザーが他のサポートされていないタイプを指定した場合、MysqlReaderはエラーを報告します.splitPkが入力されていない場合、splitPkが指定されていないかsplitPkの値が空の場合、DataXは単一チャネルを使用してテーブルデータを同期しているとみなされます.
  • 必須:No
  • デフォルト:空白
  • 2、現在使用可能なプラグイン
    現在は主にreaderプラグインで、主にrdbmsReader(sqlServer、mysql、postgresql、oracleなど)、hbase 20 xsqlreader、DrdsReader、KingbaseesReaderがあります.
    3、ソースコード解読
         reader   , CommonRdbmsReader  , CommonRdbmsReader.preCheck() 
    1、     splitPK 
    	String splitPK = queryConf.getString(Key.SPLIT_PK);
    2、   PreCheckTask   
    	PreCheckTask t = new PreCheckTask(username, password, connConf, dataBaseType, splitPK);
    3、     , PreCheckTask call   
    	@Override
      public Boolean call() throws DataXException {
         
       ……
        List<Object> splitPkSqls = this.connection.getList(Key.SPLIT_PK_SQL, Object.class);
        ……
        try {
         
          for (int i = 0; i < querySqls.size(); i++) {
         
            String splitPkSql = null;
            String querySql = querySqls.get(i).toString();
           ……
            
            /*verify splitPK*/
            try {
         
              if (splitPkSqls != null && !splitPkSqls.isEmpty()) {
         
                splitPkSql = splitPkSqls.get(i).toString();
                DBUtil.sqlValid(splitPkSql, dataBaseType);
                if (i == 0) {
         
                  SingleTableSplitUtil.preCheckSplitPk(conn, splitPkSql, fetchSize, table, userName);
                }
              }
            } catch (ParserException e) {
         
            ……
            }
          }
        } finally {
         
          DBUtil.closeDBResources(null, conn);
        }
        return true;
      }