datax(27):不太常见配置项querySql、preSql、postSql、splitPk
每個(gè)datax的json都有自己的json配置文檔,基本大同小異,有幾個(gè)配置較為少用,但是用了之后,真香~
一、querySql
1、使用教程
-  描述:在有些業(yè)務(wù)場(chǎng)景下,where這一配置項(xiàng)不足以描述所篩選的條件,用戶可以通過(guò)該配置型來(lái)自定義篩選SQL。當(dāng)用戶配置了這一項(xiàng)之后,DataX系統(tǒng)就會(huì)忽略table,column這些配置型,直接使用這個(gè)配置項(xiàng)的內(nèi)容對(duì)數(shù)據(jù)進(jìn)行篩選,例如需要進(jìn)行多表join后同步數(shù)據(jù),使用select a,b from table_a join table_b on table_a.id = table_b.id 當(dāng)用戶配置querySql時(shí),xxxReader直接忽略table、column、where條件的配置。如果配置了querySql又配置了table,column、where等,在log中會(huì)有警告日志,具體代碼在 
 OriginalConfPretreatmentUtil.dealColumnConf()
-  必選:否 
-  默認(rèn)值:無(wú) 
2、目前可以使用該配置的插件
目前主要是reader插件,主要有rdbmsReader(sqlServer、mysql、postgresql、oracle等)、hbase20xsqlreader、DrdsReader和KingbaseesReader。
3、源碼解讀
目前主要的代碼都在CommonRdbmsReader的startRead()中 1. 獲取 String querySql = readerSliceConfig.getString(Key.QUERY_SQL); 2. 調(diào)用 rs = DBUtil.query(conn, querySql, fetchSize);DBUtil.query方法中最終實(shí)現(xiàn)是如下:public static ResultSet query(Statement stmt, String sql)throws SQLException {return stmt.executeQuery(sql);}二、preSql
1、使用教程
-  描述:寫(xiě)入數(shù)據(jù)到目的表前,會(huì)先執(zhí)行這里的標(biāo)準(zhǔn)語(yǔ)句。如果 Sql 中有你需要操作到的表名稱,請(qǐng)使用 @table 表示,這樣在實(shí)際執(zhí)行 Sql 語(yǔ)句時(shí),會(huì)對(duì)變量按照實(shí)際表名稱進(jìn)行替換。比如你的任務(wù)是要寫(xiě)入到目的端的100個(gè)同構(gòu)分表(表名稱為:datax_00,datax01, … datax_98,datax_99),并且你希望導(dǎo)入數(shù)據(jù)前,先對(duì)表中數(shù)據(jù)進(jìn)行刪除操作,那么你可以這樣配置:"preSql":["delete from 表名"],效果是:在執(zhí)行到每個(gè)表寫(xiě)入數(shù)據(jù)前,會(huì)先執(zhí)行對(duì)應(yīng)的 delete from 對(duì)應(yīng)表名稱 
-  必選:否 
-  默認(rèn)值:無(wú) 
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.執(zhí)行preSqls WriterUtil.executeSqls(conn, renderedPreSqls, jdbcUrl, dataBaseType);三、postSql
1、使用教程
-  描述:寫(xiě)入數(shù)據(jù)到目的表后,會(huì)執(zhí)行這里的標(biāo)準(zhǔn)語(yǔ)句。(原理同 preSql ) 
-  必選:否 
-  默認(rèn)值:無(wú) 
2、目前可以使用該配置的插件
大部分的writer插件
3、源碼解讀
同preSql,不在贅述;
四、splitPk
1、使用教程
-  描述:進(jìn)行數(shù)據(jù)抽取時(shí),如果指定splitPk,表示用戶希望使用splitPk代表的字段進(jìn)行數(shù)據(jù)分片,DataX因此會(huì)啟動(dòng)并發(fā)任務(wù)進(jìn)行數(shù)據(jù)同步,這樣可以大大提升數(shù)據(jù)同步的效能。 推薦splitPk用戶使用表主鍵,因?yàn)楸碇麈I通常情況下比較均勻,因此切分出來(lái)的分片也不容易出現(xiàn)數(shù)據(jù)熱點(diǎn)。 目前splitPk僅支持整形數(shù)據(jù)切分,不支持浮點(diǎn)、字符串、日期等其他類型。如果用戶指定其他非支持類型,MysqlReader將報(bào)錯(cuò)! 如果splitPk不填寫(xiě),包括不提供splitPk或者splitPk值為空,DataX視作使用單通道同步該表數(shù)據(jù)。 
-  必選:否 
-  默認(rèn)值:空 
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、構(gòu)造出PreCheckTask 對(duì)象PreCheckTask t = new PreCheckTask(username, password, connConf, dataBaseType, splitPK); 3、進(jìn)行表切分,在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;}總結(jié)
以上是生活随笔為你收集整理的datax(27):不太常见配置项querySql、preSql、postSql、splitPk的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: https://blog.csdn.ne
- 下一篇: 深入react技术栈(11):样式处理
