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()
-
必選:否
-
默認值:無
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: https://blog.csdn.ne
- 下一篇: 深入react技术栈(11):样式处理