使用Maven和SpringBoot搭建客戶數據清洗項目框架
一、第一步:環(huán)境搭建——給Java項目裝上‘數據吸塵器’
目標:用Maven和Spring Boot搭建數據清洗項目框架。
步驟:
創(chuàng)建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讓數據‘全家福’
目標:將清洗后的數據整合到目標系統(tǒng)(如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();
}
}
}
五、第五步:質量驗證——給數據打‘體檢報告’
目標:用斷言和統(tǒng)計分析確保數據質量。
步驟:
數據校驗規(guī)則:
// DataValidator.java:校驗手機號格式
public class DataValidator {
public static boolean validatePhone(String phone) {
// 中國手機號正則:1開頭,11位數字
return phone != null && phone.matches("^1\\d{10}$");
}
}
生成質量報告:
// QualityReport.java:統(tǒng)計清洗結果
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("?? 清洗完成!");
}
}
六、實戰(zhàn)案例:電商客戶數據‘變形記’
場景:
清洗包含臟數據的電商客戶信息(如電話格式錯誤、地址缺失)。
完整流程代碼:
// 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("?? 數據清洗大業(yè)完成!");
}
}
七、常見問題與解決方案
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() : "";
}
通過本文,你已經掌握了:
- 環(huán)境搭建:用Maven和Spring Boot快速啟動項目。
- 數據采集:從數據庫、API、CSV等多源抓取數據。
- 數據清洗:用正則表達式、函數式編程處理缺失值、格式問題。
- 數據集成:通過ETL將數據寫入Hadoop或數據庫。
- 質量驗證:用斷言和統(tǒng)計分析確保數據合規(guī)。
- 實戰(zhàn)案例:電商客戶數據的全流程清洗。
- 故障排除:內存溢出、API數據不一致等問題的解決方法。
到此這篇關于使用Maven和SpringBoot搭建客戶數據清洗項目框架的文章就介紹到這了,更多相關SpringBoot數據清洗內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java解析php函數json_encode unicode 編碼問題
這篇文章主要介紹了java解析php函數json_encode unicode 編碼問題,需要的朋友可以參考下2016-04-04
Springboot登錄驗證的統(tǒng)一攔截處理的實現
如果不進行統(tǒng)一的攔截處理,每次用戶請求你都要去進行用戶的信息驗證,所以本文主要介紹了Springboot登錄驗證的統(tǒng)一攔截處理的實現,感興趣的可以了解一下,感興趣的可以了解一下2023-09-09

