写入
使用代码:dwd_xxx对应自己的表
//输出doris
//stateSnpv2.print();
stateSnpv2.map(new TableMapFunction<>()).sinkTo(FlinkSinkUtil.getDorisSink("dwd_xxx"));
工具类:TableMapFunction类实现了MapFunction接口,用于将输入的数据转换为String类型
该类主要用于序列化输入对象为JSON字符串,并采用Snake Case命名策略,例如:private Long createTime;
对应drios中:create_time
public class TableMapFunction<T> implements MapFunction<T, String> {
@Override
public String map(T value) throws Exception {
// 创建序列化配置对象
SerializeConfig config = new SerializeConfig();
// 设置属性命名策略为Snake Case
config.setPropertyNamingStrategy(PropertyNamingStrategy.SnakeCase);
// 使用配置对象将输入的value对象序列化为JSON字符串并返回
return JSONObject.toJSONString(value, config);
}
}
写入方法: 配置DorisSink以适应JSON格式的数据输入,用于将数据写入Doris数据库,修改为自己的节点地址、数据库、用户、密码即可
public static DorisSink<String> getDorisSink(String tableName){
// 创建并配置Properties对象,用于指定数据格式和读取方式
Properties properties = new Properties();
// 上游是json写入时,需要开启配置
properties.setProperty("format", "json");
properties.setProperty("read_json_by_line", "true");
// 构建并返回DorisSink对象
return DorisSink.<String>builder()
.setDorisReadOptions(DorisReadOptions.builder().build())
.setDorisExecutionOptions(
DorisExecutionOptions.builder()
.setLabelPrefix("label-doris" + System.currentTimeMillis()) //streamload label prefix
.setDeletable(false)
.setStreamLoadProp(properties).build()
)
.setSerializer(new SimpleStringSerializer()) //serialize according to string
.setDorisOptions(DorisOptions.builder()
.setFenodes(Constant.DORIS_FENODES)
.setTableIdentifier(Constant.DORIS_DATABASE + "." + tableName)
.setUsername(Constant.DORIS_USERNAME)
.setPassword(Constant.DORIS_PASSWORD)
.build())
.build();
}
写入报错
报错信息:问题在于尝试插入的数据没有匹配到任何已存在的分区
Reason: no partition for this tuple. tuple=+ 并且分区字段没数据
原因:将输入的value对象转换为JSON字符串,选择的Snake Case命名策略,导致映射错误
解决:
DEBUG、插入打印信息,数据显示存在打印信息
发现JAVAbean对象字段命名规范问题
修改
//新增字段
private String curDate;