日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

datax(27):不太常见配置项querySql、preSql、postSql、splitPk

發布時間:2023/12/9 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 datax(27):不太常见配置项querySql、preSql、postSql、splitPk 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

每個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);}……
  • 必選:否

  • 默認值:無

2、目前可以使用該配置的插件

目前主要是reader插件,主要有rdbmsReader(sqlServer、mysql、postgresql、oracle等)、hbase20xsqlreader、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,datax01, … datax_98,datax_99),并且你希望導入數據前,先對表中數據進行刪除操作,那么你可以這樣配置:"preSql":["delete from 表名"],效果是:在執行到每個表寫入數據前,會先執行對應的 delete from 對應表名稱

  • 必選:否

  • 默認值:無

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 )

  • 必選:否

  • 默認值:無

2、目前可以使用該配置的插件

大部分的writer插件

3、源碼解讀

同preSql,不在贅述;


四、splitPk

1、使用教程

  • 描述:進行數據抽取時,如果指定splitPk,表示用戶希望使用splitPk代表的字段進行數據分片,DataX因此會啟動并發任務進行數據同步,這樣可以大大提升數據同步的效能。

    推薦splitPk用戶使用表主鍵,因為表主鍵通常情況下比較均勻,因此切分出來的分片也不容易出現數據熱點。

    目前splitPk僅支持整形數據切分,不支持浮點、字符串、日期等其他類型。如果用戶指定其他非支持類型,MysqlReader將報錯!

    如果splitPk不填寫,包括不提供splitPk或者splitPk值為空,DataX視作使用單通道同步該表數據。

  • 必選:否

  • 默認值:空

2、目前可以使用該配置的插件

目前主要是reader插件,主要有rdbmsReader(sqlServer、mysql、postgresql、oracle等)、hbase20xsqlreader、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方法中@Overridepublic 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;}

總結

以上是生活随笔為你收集整理的datax(27):不太常见配置项querySql、preSql、postSql、splitPk的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。