使用FLink提供的类JdbcSink将数据写入Clickhouse

//TODO 获取jdbcSink的工具类 将数据写入Clickhouse
public class clickHouseUtil {
   public static <T>SinkFunction<T> getJdbcSink(String sql){
       SinkFunction<T> jdbcSink = JdbcSink.<T>sink(sql, new JdbcStatementBuilder<T>() {
                   @SneakyThrows
                   @Override
                   public void accept(PreparedStatement ps, T t) throws SQLException {
//               TODO 通过反射 对象获取类的信息
                       Field[] fields = t.getClass().getDeclaredFields();//获取所有属性包括私有
//               除了继承的属性
                       int skipFields = 0;
                       for (int i = 0; i < fields.length; i++) {
                           Field field = fields[i];
                           TransientSink annotation = field.getAnnotation(TransientSink.class);
                           if (annotation != null) {
//                       如果存在该注解
                               System.out.println("该字段不会写入Clickhouse" + field.getName());
                               skipFields++;
                               continue;//跳出本次循环
                           }
                           field.setAccessible(true);
                           Object o = field.get(t);//获取对象属性的值
                           ps.setObject(i + 1 - skipFields, o);
                       }
                   }
               }, new JdbcExecutionOptions.Builder().withBatchSize(5)
                       .withBatchIntervalMs(5000L).withMaxRetries(3).build(),
               new JdbcConnectionOptions.JdbcConnectionOptionsBuilder()
                       .withDriverName("ru.yandex.clickhouse.ClickHouseDriver")
                       .withUrl("jdbc:clickhouse://hadoop106:8123")
                       .build());
       return jdbcSink;
   }
}

通过自定义注解过滤掉我们不需要写入Clickhouse的字段

//TODO 该注解用来标识往clickhouse写入的时候不需要的字段
@Target(FIELD)//标识该注解用于属性上
@Retention(RetentionPolicy.RUNTIME)//注解保留策略
public @interface TransientSink {
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值