datax 从oracle增量抽取数据到pg,解决0x00问题

1、datax官方版本不支持pg的insert on conflict模式,需要改造代码如下:

  •   将postgresqlwriter.java中的init改为如下代码
	@Override
		public void init() {
			this.originalConfig = super.getPluginJobConf();

			this.commonRdbmsWriterMaster = new CommonRdbmsWriter.Job(DATABASE_TYPE);
			this.commonRdbmsWriterMaster.init(this.originalConfig);
		}
  • 修改plugin-rdbms-util目录下的writerUtil.java,找到getWriteTemplate并在类型为PostgreSQL判断条件下修改为如下内容:
 if(null!=writeMode&&(writeMode.trim().toLowerCase().startsWith("update")||writeMode.trim().toLowerCase().startsWith("replace"))){
                      writeDataSqlTemplate = new StringBuilder().append("INSERT INTO %s (")
                        .append(StringUtils.join(columnHolders, ","))
                        .append(") VALUES(").append(StringUtils.join(valueHolders, ","))
                        .append(")").append(onConFlictDoString(writeMode, columnHolders)).toString();
                    }else{
                          writeDataSqlTemplate = new StringBuilder().append("INSERT INTO %s (")
                        .append(StringUtils.join(columnHolders, ","))
                        .append(") VALUES(").append(StringUtils.join(valueHolders, ","))
                        .append(")").toString();
                    }
  • 在writerUtil.java增加onConFlictDoString方法如下:
 public static String onConFlictDoString(String conflict, List<String> columnHolders) {
        conflict = conflict.replace("update", "");
        StringBuilder sb = new StringBuilder();
        sb.append(" ON CONFLICT ");
        sb.append(conflict);
        sb.append(" DO ");
        if (columnHolders == null || columnHolders.size() < 1) {
            sb.append("NOTHING");
            return sb.toString();
        }
        sb.append(" UPDATE SET ");
        boolean first = true;
        for (String column : columnHolders) {
            if (!first) {
                sb.append(",");
            } else {
                first = false;
            }
            sb.append(column);
            sb.append("=excluded.");
            sb.append(column);
        }
        return sb.toString();
    }

2、解决oracle中的零字符串,0x00

在plugin-rdbms-util下commonRdbmsWriter.java中找到fillPreparedStatementColumnType方法,使用replaceAll将0x00即\u0000 替换为空字符串修改内容如下:

case Types.CHAR:
                case Types.NCHAR:
                case Types.CLOB:
                case Types.NCLOB:
                case Types.VARCHAR:
                case Types.ARRAY:
                case Types.LONGVARCHAR:
                case Types.NVARCHAR:
                case Types.LONGNVARCHAR:
                    preparedStatement.setString(columnIndex + 1, null!=column
                            .asString()?column.asString().replaceAll("\\u0000",""):column
                            .asString());
                    break;

                case Types.SMALLINT:
                case Types.INTEGER:
                case Types.BIGINT:
                case Types.NUMERIC:
                case Types.DECIMAL:
                case Types.FLOAT:
                case Types.REAL:
                case Types.DOUBLE:
                    String strValue = column.asString();
                    if (emptyAsNull && "".equals(strValue)) {
                        preparedStatement.setString(columnIndex + 1, null);
                    } else {
                        preparedStatement.setString(columnIndex + 1, null!=strValue?strValue.replaceAll("\\u0000",""):strValue);
                    }
                    break;

3、打包postgresqlwriter,plugin-rdbms-util

    mvn clean install -DskipTests

    打包完成后,分别:

  将postgresqlwriter-0.0.1-SNAPSHOT.jar拷贝至datax/plugin/writer/postgresqlwriter目录下 

  将plugin-rdbms-util-0.0.1-SNAPSHOT.jar拷贝至datax/plugin/writer/postgresqlwriter/libs目录下

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值