Canal同步mysql 的binlog日志,point/polygon类型乱码处理

文章讲述了在使用canal从MySQL同步数据到ES时遇到point和polygon字段在Kafka中显示为乱码的问题。作者分析了canal源码并提供了解决方案,包括如何修改canal-server的LogEventConvert类来正确处理这类数据,以及需要引入jts包进行WKB转换。
摘要由CSDN通过智能技术生成

一、背景

    将Mysql数据同步到ES,采用canal采集binlog日志,发现point/polygon字段写入到kafka为乱码,跟踪canal源码发现并未对该类型进行处理,记录一下方便有需要的朋友少走弯路,加班狗时间紧 忽略排版。

二、数据示例

   1. 直接上示例代码

public static void main(String[] args) throws ParseException {
        // 定义byte数组
        byte[] byteArray = new byte[]{0, 0, 0, 0, 1, 1, 0, 0, 0, -40, 68, 102, 46, 112, 24, 93, 64, 96, 60, -125, -122, -2, -5, 67, 64};
        // 解析byte数组 坐标参考系为little endian格式
        ByteOrder byteOrder = ByteOrder.LITTLE_ENDIAN;  
        ByteBuffer.wrap(byteArray, 0, 4).order(byteOrder).getInt();
        byte[] wkbData = new byte[byteArray.length - 4];
        System.arraycopy(byteArray, 4, wkbData, 0, wkbData.length);
        // 将byte数组转换为WKB格式
        WKBReader wkbReader = new WKBReader();
        Geometry geometry = wkbReader.read(wkbData);
        System.out.println(geometry.toString());
    }

2. 如果需要修改canal-server源码
canal版本:1.6.0
修改parse工程下>LogEventConvert类,第832行

case Types.BINARY:
                       
if(columnBuilder.getMysqlType().equals("point")||columnBuilder.getMysqlType().equals("polygon")){
         try {
              // 将Serializable类型转换为byte[]
              byte[] bytes = (byte[]) value;
              ByteOrder byteOrder = ByteOrder.LITTLE_ENDIAN;
              ByteBuffer.wrap(bytes, 0, 4).order(byteOrder).getInt();
              byte[] wkbData = new byte[bytes.length - 4];
              System.arraycopy(bytes, 4, wkbData, 0, wkbData.length);
              // 将byte数组转换为WKB格式
              WKBReader wkbReader = new WKBReader();
              Geometry geometry = wkbReader.read(wkbData);
              columnBuilder.setValue(geometry.toString());
              } catch (Exception e) {
                   e.printStackTrace();
                   }
            }
            break;

3. 还需要引入jts包

       <dependency>
			<groupId>com.vividsolutions</groupId>
			<artifactId>jts-core</artifactId>
			<version>1.14.0</version>
		</dependency>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值