flink写入Drios及写入报错

写入

使用代码: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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值