使用Maven和SpringBoot搭建客户数据清洗项目框架

 更新时间:2025年07月10日 10:23:55   作者:墨瑾轩  
这篇文章主要为大家详细介绍了如何使用Maven和SpringBoot搭建客户数据清洗项目框架,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下

一、第一步:环境搭建——给Java项目装上‘数据吸尘器’

目标:用Maven和Spring Boot搭建数据清洗项目框架。

步骤

创建Maven项目

<!-- pom.xml:添加依赖 -->  
<dependencies>  
  <!-- 数据库连接 -->  
  <dependency>  
    <groupId>com.zaxxer</groupId>  
    <artifactId>HikariCP</artifactId>  
    <version>5.0.1</version>  
  </dependency>  
  <!-- 函数式编程工具 -->  
  <dependency>  
    <groupId>org.apache.commons</groupId>  
    <artifactId>commons-lang3</artifactId>  
    <version>3.12.0</version>  
  </dependency>  
  <!-- 数据验证 -->  
  <dependency>  
    <groupId>org.assertj</groupId>  
    <artifactId>assertj-core</artifactId>  
    <version>3.24.2</version>  
    <scope>test</scope>  
  </dependency>  
</dependencies>  

配置数据库连接

# application.properties:连接MySQL  
spring.datasource.url=jdbc:mysql://localhost:3306/customer_db  
spring.datasource.username=root  
spring.datasource.password=root  
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver  

二、第二步:数据采集——用Java抓取‘脏数据’

目标:从数据库、API、CSV等多源采集客户数据。

步骤

数据库查询

// CustomerDAO.java:从MySQL读取客户数据  
import java.sql.*;  
import java.util.*;  

public class CustomerDAO {  
    public List<Map<String, Object>> fetchDirtyData() {  
        String query = "SELECT * FROM customers WHERE status = 'pending'";  
        List<Map<String, Object>> data = new ArrayList<>();  

        try (Connection conn = DriverManager.getConnection("jdbc:mysql://...", "...", "...");  
             Statement stmt = conn.createStatement();  
             ResultSet rs = stmt.executeQuery(query)) {  

            ResultSetMetaData meta = rs.getMetaData();  
            while (rs.next()) {  
                Map<String, Object> row = new HashMap<>();  
                for (int i = 1; i <= meta.getColumnCount(); i++) {  
                    row.put(meta.getColumnName(i), rs.getObject(i));  
                }  
                data.add(row);  
            }  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
        return data;  
    }  
}  

API数据采集

// ApiService.java:调用第三方API获取数据  
import java.net.http.*;  
import java.net.URI;  
import java.util.concurrent.*;  

public class ApiService {  
    public String fetchDataFromAPI() {  
        HttpClient client = HttpClient.newHttpClient();  
        HttpRequest request = HttpRequest.newBuilder()  
            .uri(URI.create("https://api.example.com/customers"))  
            .build();  

        try {  
            return client.send(request, BodyHandlers.ofString()).body();  
        } catch (Exception e) {  
            return "{}"; // 返回空对象避免崩溃  
        }  
    }  
}  

三、第三步:数据清洗——用Java的‘三板斧’搞定脏数据

目标:用正则表达式、函数式编程、并行流清洗数据。

步骤

处理缺失值与格式问题

// DataCleaner.java:清洗单个字段  
import org.apache.commons.lang3.StringUtils;  

public class DataCleaner {  
    public static String cleanPhone(String rawPhone) {  
        // 去除非数字字符  
        String cleaned = StringUtils.remove(rawPhone, " ").replaceAll("[^0-9]", "");  
        // 补全11位手机号  
        if (cleaned.length() == 10) {  
            return "1" + cleaned;  // 假设国内手机号  
        }  
        return cleaned;  
    }  
}  

批量清洗与去重

// BatchProcessor.java:并行处理数据  
public class BatchProcessor {  
    public static List<Map<String, Object>> cleanData(List<Map<String, Object>> rawData) {  
        return rawData.parallelStream()  
            .filter(row -> row.get("email") != null)  // 过滤缺失邮箱  
            .map(row -> {  
                Map<String, Object> cleanedRow = new HashMap<>(row);  
                cleanedRow.put("phone", DataCleaner.cleanPhone((String) row.get("phone")));  
                cleanedRow.put("address", row.get("address").toString().trim());  // 去除前后空格  
                return cleanedRow;  
            })  
            .distinct()  // 去重(需重写equals/hashCode)  
            .collect(Collectors.toList());  
    }  
}  

四、第四步:数据集成——用ETL让数据‘全家福’

目标:将清洗后的数据整合到目标系统(如Hadoop、数据库)。

步骤

数据转换为JSON格式

// DataTransformer.java:使用Jackson库  
import com.fasterxml.jackson.databind.ObjectMapper;  

public class DataTransformer {  
    public String toJson(List<Map<String, Object>> data) {  
        ObjectMapper mapper = new ObjectMapper();  
        try {  
            return mapper.writeValueAsString(data);  
        } catch (Exception e) {  
            return "[]";  
        }  
    }  
}  

写入HDFS(Hadoop)

// HdfsWriter.java:用Hadoop API  
import org.apache.hadoop.conf.Configuration;  
import org.apache.hadoop.fs.*;  

public class HdfsWriter {  
    public void writeToFile(String data) {  
        Configuration conf = new Configuration();  
        Path path = new Path("/user/hadoop/cleaned_customers.json");  

        try (FSDataOutputStream out = FileSystem.get(conf).create(path)) {  
            out.write(data.getBytes());  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}  

五、第五步:质量验证——给数据打‘体检报告’

目标:用断言和统计分析确保数据质量。

步骤

数据校验规则

// DataValidator.java:校验手机号格式  
public class DataValidator {  
    public static boolean validatePhone(String phone) {  
        // 中国手机号正则:1开头,11位数字  
        return phone != null && phone.matches("^1\\d{10}$");  
    }  
}  

生成质量报告

// QualityReport.java:统计清洗结果  
public class QualityReport {  
    public static void generateReport(List<Map<String, Object>> data) {  
        long validPhones = data.stream()  
            .filter(row -> DataValidator.validatePhone((String) row.get("phone")))  
            .count();  

        System.out.println("✅ 有效手机号数量:" + validPhones);  
        System.out.println("⚠️ 总数据量:" + data.size());  
        System.out.println("📊 清洗完成!");  
    }  
}  

六、实战案例:电商客户数据‘变形记’

场景

清洗包含脏数据的电商客户信息(如电话格式错误、地址缺失)。

完整流程代码

// Main.java:端到端流程  
public class Main {  
    public static void main(String[] args) {  
        // 1. 采集数据  
        CustomerDAO dao = new CustomerDAO();  
        List<Map<String, Object>> raw = dao.fetchDirtyData();  

        // 2. 清洗数据  
        List<Map<String, Object>> cleaned = BatchProcessor.cleanData(raw);  

        // 3. 验证数据  
        QualityReport.generateReport(cleaned);  

        // 4. 输出到HDFS  
        HdfsWriter writer = new HdfsWriter();  
        writer.writeToFile(new DataTransformer().toJson(cleaned));  

        System.out.println("🎉 数据清洗大业完成!");  
    }  
}  

七、常见问题与解决方案

Q1:数据量太大,Java内存溢出?

解决

// 使用分页查询  
public List<Map<String, Object>> fetchDirtyData(int offset, int limit) {  
    String query = "SELECT * FROM customers WHERE status = 'pending' LIMIT " + offset + ", " + limit;  
    // ...  
}  

Q2:API返回数据格式不一致?

解决

// 使用Optional处理可能缺失的字段  
public String getSafeField(JsonNode node, String key) {  
    return node.has(key) ? node.get(key).asText() : "";  
}  

通过本文,你已经掌握了:

  • 环境搭建:用Maven和Spring Boot快速启动项目。
  • 数据采集:从数据库、API、CSV等多源抓取数据。
  • 数据清洗:用正则表达式、函数式编程处理缺失值、格式问题。
  • 数据集成:通过ETL将数据写入Hadoop或数据库。
  • 质量验证:用断言和统计分析确保数据合规。
  • 实战案例:电商客户数据的全流程清洗。
  • 故障排除:内存溢出、API数据不一致等问题的解决方法。

到此这篇关于使用Maven和SpringBoot搭建客户数据清洗项目框架的文章就介绍到这了,更多相关SpringBoot数据清洗内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Eclipse插件大全 挑选最牛的TOP30(全)

    Eclipse插件大全 挑选最牛的TOP30(全)

    ?“Eclipse最牛的30个插件”不知道看官们是否了解,风少侠特意翻译出来奉献给各位,希望大家喜欢
    2013-02-02
  • spring boot前后端交互之数据格式转换问题

    spring boot前后端交互之数据格式转换问题

    这篇文章主要介绍了spring boot前后端交互之数据格式转换,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • Springboot内置tomcat配置虚拟路径过程解析

    Springboot内置tomcat配置虚拟路径过程解析

    这篇文章主要介绍了Springboot内置tomcat配置虚拟路径过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • java解析php函数json_encode unicode 编码问题

    java解析php函数json_encode unicode 编码问题

    这篇文章主要介绍了java解析php函数json_encode unicode 编码问题,需要的朋友可以参考下
    2016-04-04
  • SpringBoot3集成Zookeeper的代码详解

    SpringBoot3集成Zookeeper的代码详解

    ZooKeeper是一个集中的服务,用于维护配置信息、命名、提供分布式同步、提供组服务,分布式应用程序以某种形式使用所有这些类型的服务,本文将给大家介绍SpringBoot3集成Zookeeper的代码,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • Java之Thread的join方法实例

    Java之Thread的join方法实例

    这篇文章主要介绍了Java之Thread的join方法,实例形式讲述了join方法的应用,需要的朋友可以参考下
    2014-10-10
  • Springboot登录验证的统一拦截处理的实现

    Springboot登录验证的统一拦截处理的实现

    如果不进行统一的拦截处理,每次用户请求你都要去进行用户的信息验证,所以本文主要介绍了Springboot登录验证的统一拦截处理的实现,感兴趣的可以了解一下,感兴趣的可以了解一下
    2023-09-09
  • rocketmq如何修改存储路径

    rocketmq如何修改存储路径

    这篇文章主要介绍了rocketmq如何修改存储路径的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 单元测试 @mock与@SpringBootTest的使用

    单元测试 @mock与@SpringBootTest的使用

    这篇文章主要介绍了单元测试 @mock与@SpringBootTest的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • SpringBoot2整合Redis实现读写操作

    SpringBoot2整合Redis实现读写操作

    Redis,对于大家来说应该不陌生,是经常使用的开发技术之一。本文将结合实例代码,介绍SpringBoot2整合Redis实现读写操作,感兴趣的小伙伴们可以参考一下
    2021-07-07

最新评论