datax(27):不太常见配置项querySql、preSql、postSql、splitPk[通俗易懂]

datax(27):不太常见配置项querySql、preSql、postSql、splitPk[通俗易懂]每个datax的json都有自己的json配置文档,基本大同小异,有几个配置较为少用,但是用了之后,真香~一、querySql1、使用教程描述:在有些业务场景下,where这一配置项不足以描述所筛选的条件,用户可以通过该配置型来自定义筛选SQL。当用户配置了这一项之后,DataX系统就会忽略table,column这些配置型,直接使用这个配置项的内容对数据进行筛选,例如需要进行多表join后同步数据,使用selecta,bfromtable_ajointable_bontabl.

大家好,又见面了,我是你们的朋友全栈君。

每个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方法中
	@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;
  }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145802.html原文链接:https://javaforall.net

(2)
上一篇 2022年5月16日 下午3:40
下一篇 2022年5月16日 下午4:00


相关推荐

  • CentOS7 网络配置超详细ip、网关设置

    CentOS7 网络配置超详细ip、网关设置CentOS7网络配置一、在虚拟机中安装CentOS操作系统安装好虚拟机创建新的虚拟机,选择自定义(高级),点击下一步虚拟机硬件兼容性默认,浏览需要安装的CentOS6.5镜像文件自定义用户名和密码(用于登录)设置虚拟机名称和存储路径处理器设置默认(后面可以修改),内存设为1GB网络类型选择NAT模式选择创建新虚拟磁盘最大磁盘大小设为20GB,然后将虚拟磁盘存储为单个文件将创建好的磁盘文件存储在虚拟机指定目录下虚拟机创建完成二、虚拟网络配置编辑虚拟网络设置

    2022年6月14日
    86
  • gcc的__builtin_函数介绍

    gcc的__builtin_函数介绍GCC 提供了一系列的 builtin 函数 可以实现一些简单快捷的功能来方便程序编写 另外 很多 builtin 函数可用来优化编译结果 这些函数以 builtin 作为函数名前缀 很多 C 标准库函数都有与之对应的 GCCbuiltin 函数 例如 strcpy 有对应的 builtin strcpy 内建函数 下面就介绍一些 builtin 函数及其作用 nbsp builtin ffs x

    2026年3月17日
    3
  • 如何在vue项目中使用md5加密

    如何在vue项目中使用md5加密npm安装:npminstall–savejs-md51.在需要使用的项目文件中引入:importmd5from’js-md5′;使用:md5(‘holle’)//bcecb35d0a12baad472fbe0392bcc0432.或者在main.js文件中将md5转换成vue原型:importmd5from’js-md5…

    2022年7月11日
    30
  • C#常用 API函数大全[通俗易懂]

    C#常用 API函数大全[通俗易懂]常用WindowsAPI1.API之网络函数WNetAddConnection创建同一个网络资源的永久性连接WNetAddConnection2创建同一个网络资源的连接WNetAddConnection3创建同一个网络资源的连接WNetCancelConnection结束一个网络连接WNetCancelConnection2结束一个网络连接WNetCloseEn

    2025年6月25日
    8
  • LaTeX详细教程+技巧总结[通俗易懂]

    LaTeX详细教程+技巧总结[通俗易懂]LaTeX技巧总结,包含LaTeX工具,LaTeX模板,LaTeX技巧,LaTeX基础,文章架构,字体、大小和颜色,链接,列表,图片,表格,数学公式,算法(伪代码),代码块,论文写作,等等。

    2022年5月16日
    61
  • USB协议详解

    USB协议详解本博客整理自网络,仅供学习参考,如有侵权,联系删除。邮箱:rom100@163.com一个transfer(传输)由一个或多个transaction(事务)构成,一个transaction(事务)由一个或多个packet(包)构成,一个packet(包)由一个或多个sync(域)构成。1.传输数据通信USB的数据通讯首先是基于传输(transfer)的,传输的类型有:中断传输、批量传输…

    2022年6月29日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号