使用Maven和SpringBoot搭建客户数据清洗项目框架
目录
- 一、第一步:环境搭建——给Java项目装上‘数据吸尘器’
- 二、第二步:数据采集——用Java抓取‘脏数据’
- 三、第三步:数据清洗——用Java的‘三板斧’搞定脏数据
- 四、第四步:数据集成——用ETL让数据‘全家福’
- 五、第五步:质量验证——给数据打‘体检报告’
- 六、实战案例:电商客户数据‘变形记’
- 七、常见问题与解决方案
一、第一步:环境搭建——给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</androidgroupId>
<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 (injavascriptt 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; // 假设国内手机号
}
reandroidturn 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) roandroidw.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 {
puhttp://www.devze.comblic 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数据清洗内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
加载中,请稍侯......
精彩评论