flink多数据类型从Kafka同步到动态HDFS目录

上文中只是处理了JSON数据,参考:juejin.cn/post/732131... 实际使用场景常见的数据除了json之外还有csv等,期望flink程序可以适配这两种数据类型,分别按照事件时间将数据写入到文件系统中。

程序

核心还是实现BucketAssigner接口,这里我们将具体逻辑抽取放到类方法中实现,目的是为了可以正常调用并访问全局配置以及对象。

java 复制代码
.withBucketAssigner(new BucketAssigner<String, String>() {
    @Override
    public String getBucketId(String s, Context context) {
        String bucketId;  //? 定义bucketId变量
        String customBucketId = null;
        try {
        // 获取自定义的bucketId
            customBucketId = kafka2FileSys.getCustomBucketId(s);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        //? 构造bucketId并返回
        bucketId = "dtime=" + customBucketId;
        return bucketId;
    }

    @Override
    public SimpleVersionedSerializer<String> getSerializer() {
        return SimpleVersionedStringSerializer.INSTANCE;
    }
})

具体的类方法如下:

java 复制代码
public String getCustomBucketId(String value) throws Exception {
    String dtime;
    // 从配置文件中读取数据类型以及其他配置
    String dataType = getConfigValue("datatype");  // json or text
    String dtField = getConfigValue("datetimefield");  // json datetime field
    int dtIndex = Integer.parseInt(getConfigValue("datetimefieldindex"));  // text datetime index
    String dataPatter = getConfigValue("datapatter");  // text sign
    if(dataType.equalsIgnoreCase("JSON")){
        JSONObject jsonObject = JSON.parseObject(value);
        dtime = jsonObject.getString(dtField);
    } else if (dataType.equalsIgnoreCase("TEXT")) {
        String[] valueList = value.split(dataPatter);
        dtime = valueList[dtIndex];
    }else{
        return null;
    }
    // 解析日期时间数据
    String dtFormat = getConfigValue("datetimeformat");
    DatetimeTool dtTool = new DatetimeTool(dtime, dtFormat);
    return dtTool.getDate("yyyyMMdd");
}

如果是json数据,则从一级的key中获取对应的日期时间数据;如果是csv(按照分隔符分割的文本数据)的话,从配置中加载日期时间的索引以及分隔符,然后进行解析。 然后按照对应的日期时间格式进行解析返回yyyyMMdd的日期时间字符串。 BucketAssigner接口再做前缀的拼接,例如添加dtime=的前缀,组成dtime=20230101的格式。

主要的核心代码就是上述的内容了。这个需求只是做同步,可用于同步到数仓的ODS层。具体的数据处理以及清洗的逻辑没有实现多数据类型的清洗逻辑比较麻烦,可以对各业务的数据情况以及数据类型、格式等做抽象,封装数据解析处理类,在map或者flatmap等算子中创建数据处理解析类实现解析的逻辑,也可以实现自定义的抽象接口等。 其他的工具类就不废话了。

github

GitHub地址:github.com/saberbin/Ka...

gitee地址:gitee.com/saberbin/Ka...

(因为GitHub没法正常访问,所以GitHub目前仓库是空的,gitee有完整的项目代码。)readme文档没有写,因为GitHub无法正常访问,写了也是白写。后面心情好了会写readme,push到GitHub,gitee不会再更新了种植。 gitee姑且是设置开源了,不知是否可以正常访问。 最后,快过年了,新春快乐。

相关推荐
程序员塔塔喵33 分钟前
【MySQL篇|第一篇】索引失效的情况
数据库·mysql·索引失效
北京青蓝智慧马老师1 小时前
比外部黑客更难防的,是那个有权限的自己人(3 个脱敏复盘)
大数据·数据库·人工智能
金銀銅鐵1 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
AI人工智能+电脑小能手1 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
笃行3501 小时前
拆一台数据集成产品:KFS 的骨架、肌肉和神经
数据库
4SAPI2 小时前
搭建 AI 数据分析工具大模型 API 选型指南
数据库·人工智能·架构·php·1024程序员节
paopaokaka_luck3 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
码士集团小青3 小时前
面霸篇:高频 Java 基础问题(核心卷一)
linux·服务器·数据库·redis·缓存·1024程序员节
2301_32241428043 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
小奏技术3 小时前
为什么 2026 年了,我又写了一个 API 调试工具
github