问题
flink版本:1.18.1,mysql版本:8.0.40
使用FlinkCDC的MySqlSource 连接mysql,对于datetime 类型字段,Flink CDC 会自动将 datetime 类型的字段转换为时间戳(BIGINT 类型)。如:2020-10-21 18:49:12 变成 1603306152000
解决
1.自定义转换器类
创建 MyDateToStringConverter 类 实现 CustomConverter 接口,并重写
import io.debezium.spi.converter.CustomConverter;
import io.debezium.spi.converter.RelationalColumn;
import org.apache.kafka.connect.data.SchemaBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Timestamp;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Properties;
import java.util.function.Consumer;
/**
* 日期时间类型转换成字符串
*/
public class MyDateToStringConverter implements CustomConverter<SchemaBuilder, RelationalColumn> {
private static final Logger log = LoggerFactory.getLogger(MyDateToStringConverter.class);
private DateTimeFormatter dateFormatter = DateTimeFormatter.ISO_DATE;
private DateTimeFormatter timeFormatter = DateTimeFormatter.ISO_TIME;
private DateTimeFormatter datetimeFormatter = DateTimeFormatter.ISO_DATE_TIME;
private DateTimeFormatter timestampFormatter = DateTimeFormatter.ISO_DATE_TIME;
private ZoneId timestampZoneId = ZoneId.systemDefault();
public static final String CONVERTERS = "converters";
public static final String DATE = "date";
public static final String DATE_TYPE = "date.type";
public static final String DATE_FORMAT_DATE = "date.format.date";
public static final String DATE_FORMAT_DATETIME = "date.format.datetime";
public static final String DATE_FORMAT_TIMESTAMP = "date.format.timestamp";
public static final String DATE_FORMAT_TIMESTAMP_ZONE = "date.format.timestamp.zone";
public static final String YEAR_MONTH_DAY_FORMAT = "yyyy-MM-dd"