最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Maven和SpringBoot搭建客戶數(shù)據(jù)清洗項(xiàng)目框架

 更新時(shí)間:2025年07月10日 10:23:55   作者:墨瑾軒  
這篇文章主要為大家詳細(xì)介紹了如何使用Maven和SpringBoot搭建客戶數(shù)據(jù)清洗項(xiàng)目框架,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下

一、第一步:環(huán)境搭建——給Java項(xiàng)目裝上‘數(shù)據(jù)吸塵器’

目標(biāo):用Maven和Spring Boot搭建數(shù)據(jù)清洗項(xiàng)目框架。

步驟

創(chuàng)建Maven項(xiàng)目

<!-- pom.xml:添加依賴 -->  
<dependencies>  
  <!-- 數(shù)據(jù)庫(kù)連接 -->  
  <dependency>  
    <groupId>com.zaxxer</groupId>  
    <artifactId>HikariCP</artifactId>  
    <version>5.0.1</version>  
  </dependency>  
  <!-- 函數(shù)式編程工具 -->  
  <dependency>  
    <groupId>org.apache.commons</groupId>  
    <artifactId>commons-lang3</artifactId>  
    <version>3.12.0</version>  
  </dependency>  
  <!-- 數(shù)據(jù)驗(yàn)證 -->  
  <dependency>  
    <groupId>org.assertj</groupId>  
    <artifactId>assertj-core</artifactId>  
    <version>3.24.2</version>  
    <scope>test</scope>  
  </dependency>  
</dependencies>  

配置數(shù)據(jù)庫(kù)連接

# 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  

二、第二步:數(shù)據(jù)采集——用Java抓取‘臟數(shù)據(jù)’

目標(biāo):從數(shù)據(jù)庫(kù)、API、CSV等多源采集客戶數(shù)據(jù)。

步驟

數(shù)據(jù)庫(kù)查詢

// CustomerDAO.java:從MySQL讀取客戶數(shù)據(jù)  
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數(shù)據(jù)采集

// ApiService.java:調(diào)用第三方API獲取數(shù)據(jù)  
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 "{}"; // 返回空對(duì)象避免崩潰  
        }  
    }  
}  

三、第三步:數(shù)據(jù)清洗——用Java的‘三板斧’搞定臟數(shù)據(jù)

目標(biāo):用正則表達(dá)式、函數(shù)式編程、并行流清洗數(shù)據(jù)。

步驟

處理缺失值與格式問題

// DataCleaner.java:清洗單個(gè)字段  
import org.apache.commons.lang3.StringUtils;  

public class DataCleaner {  
    public static String cleanPhone(String rawPhone) {  
        // 去除非數(shù)字字符  
        String cleaned = StringUtils.remove(rawPhone, " ").replaceAll("[^0-9]", "");  
        // 補(bǔ)全11位手機(jī)號(hào)  
        if (cleaned.length() == 10) {  
            return "1" + cleaned;  // 假設(shè)國(guó)內(nèi)手機(jī)號(hào)  
        }  
        return cleaned;  
    }  
}  

批量清洗與去重

// BatchProcessor.java:并行處理數(shù)據(jù)  
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());  
    }  
}  

四、第四步:數(shù)據(jù)集成——用ETL讓數(shù)據(jù)‘全家福’

目標(biāo):將清洗后的數(shù)據(jù)整合到目標(biāo)系統(tǒng)(如Hadoop、數(shù)據(jù)庫(kù))。

步驟

數(shù)據(jù)轉(zhuǎn)換為JSON格式

// DataTransformer.java:使用Jackson庫(kù)  
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();  
        }  
    }  
}  

五、第五步:質(zhì)量驗(yàn)證——給數(shù)據(jù)打‘體檢報(bào)告’

目標(biāo):用斷言和統(tǒng)計(jì)分析確保數(shù)據(jù)質(zhì)量。

步驟

數(shù)據(jù)校驗(yàn)規(guī)則

// DataValidator.java:校驗(yàn)手機(jī)號(hào)格式  
public class DataValidator {  
    public static boolean validatePhone(String phone) {  
        // 中國(guó)手機(jī)號(hào)正則:1開頭,11位數(shù)字  
        return phone != null && phone.matches("^1\\d{10}$");  
    }  
}  

生成質(zhì)量報(bào)告

// QualityReport.java:統(tǒng)計(jì)清洗結(jié)果  
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("? 有效手機(jī)號(hào)數(shù)量:" + validPhones);  
        System.out.println("?? 總數(shù)據(jù)量:" + data.size());  
        System.out.println("?? 清洗完成!");  
    }  
}  

六、實(shí)戰(zhàn)案例:電商客戶數(shù)據(jù)‘變形記’

場(chǎng)景

清洗包含臟數(shù)據(jù)的電商客戶信息(如電話格式錯(cuò)誤、地址缺失)。

完整流程代碼

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

        // 2. 清洗數(shù)據(jù)  
        List<Map<String, Object>> cleaned = BatchProcessor.cleanData(raw);  

        // 3. 驗(yàn)證數(shù)據(jù)  
        QualityReport.generateReport(cleaned);  

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

        System.out.println("?? 數(shù)據(jù)清洗大業(yè)完成!");  
    }  
}  

七、常見問題與解決方案

Q1:數(shù)據(jù)量太大,Java內(nèi)存溢出?

解決

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

Q2:API返回?cái)?shù)據(jù)格式不一致?

解決

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

通過本文,你已經(jīng)掌握了:

  • 環(huán)境搭建:用Maven和Spring Boot快速啟動(dòng)項(xiàng)目。
  • 數(shù)據(jù)采集:從數(shù)據(jù)庫(kù)、API、CSV等多源抓取數(shù)據(jù)。
  • 數(shù)據(jù)清洗:用正則表達(dá)式、函數(shù)式編程處理缺失值、格式問題。
  • 數(shù)據(jù)集成:通過ETL將數(shù)據(jù)寫入Hadoop或數(shù)據(jù)庫(kù)。
  • 質(zhì)量驗(yàn)證:用斷言和統(tǒng)計(jì)分析確保數(shù)據(jù)合規(guī)。
  • 實(shí)戰(zhàn)案例:電商客戶數(shù)據(jù)的全流程清洗。
  • 故障排除:內(nèi)存溢出、API數(shù)據(jù)不一致等問題的解決方法。

到此這篇關(guān)于使用Maven和SpringBoot搭建客戶數(shù)據(jù)清洗項(xiàng)目框架的文章就介紹到這了,更多相關(guān)SpringBoot數(shù)據(jù)清洗內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring異步service中處理線程數(shù)限制詳解

    spring異步service中處理線程數(shù)限制詳解

    這篇文章主要給大家介紹了關(guān)于spring異步service中處理線程數(shù)限制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • servlet簡(jiǎn)單實(shí)現(xiàn)文件下載的方法

    servlet簡(jiǎn)單實(shí)現(xiàn)文件下載的方法

    這篇文章主要介紹了servlet簡(jiǎn)單實(shí)現(xiàn)文件下載的方法,涉及基于servlet技術(shù)實(shí)現(xiàn)流形式文件傳輸?shù)南嚓P(guān)操作技巧,需要的朋友可以參考下
    2016-12-12
  • IDEA下lombok安裝及找不到get,set的問題的解決方法

    IDEA下lombok安裝及找不到get,set的問題的解決方法

    這篇文章主要介紹了IDEA下lombok安裝及找不到get,set的問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Java動(dòng)態(tài)代理Proxy應(yīng)用和底層源碼詳細(xì)分析

    Java動(dòng)態(tài)代理Proxy應(yīng)用和底層源碼詳細(xì)分析

    Java動(dòng)態(tài)代理是一種在運(yùn)行時(shí)生成代理類的機(jī)制,用于代替手動(dòng)編寫代理類的過程,這篇文章主要給大家介紹了關(guān)于Java動(dòng)態(tài)代理Proxy應(yīng)用和底層源碼詳細(xì)分析的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • Spring Security使用數(shù)據(jù)庫(kù)認(rèn)證及用戶密碼加密和解密功能

    Spring Security使用數(shù)據(jù)庫(kù)認(rèn)證及用戶密碼加密和解密功能

    這篇文章主要介紹了Spring Security使用數(shù)據(jù)庫(kù)認(rèn)證及用戶密碼加密和解密,本文通過代碼與截圖的形式給大家介紹的非常詳細(xì),對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 一文讓你徹底明白Java中的值傳遞和引用傳遞

    一文讓你徹底明白Java中的值傳遞和引用傳遞

    這篇文章主要給大家介紹了關(guān)于Java中值傳遞和引用傳遞的相關(guān)資料,值傳遞是指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)復(fù)制一份傳遞到函數(shù)中,引用傳遞是指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)的引用直接傳遞到函數(shù)中,需要的朋友可以參考下
    2023-10-10
  • Spring?Security如何實(shí)現(xiàn)升級(jí)密碼加密方式詳解

    Spring?Security如何實(shí)現(xiàn)升級(jí)密碼加密方式詳解

    這篇文章主要為大家介紹了Spring?Security實(shí)現(xiàn)升級(jí)密碼加密方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Java的非對(duì)稱加密(RSA、數(shù)字簽名、數(shù)字證書)詳解

    Java的非對(duì)稱加密(RSA、數(shù)字簽名、數(shù)字證書)詳解

    這篇文章主要介紹了Java的非對(duì)稱加密(RSA、數(shù)字簽名、數(shù)字證書)詳解,非對(duì)稱加密:加密、解密使用不同的兩把密鑰,這兩把密鑰成對(duì),一般通信開始時(shí)通過非對(duì)稱加密將對(duì)稱加密的密鑰發(fā)送給另一方,然后雙方通過對(duì)稱加密來進(jìn)行溝通,需要的朋友可以參考下
    2024-01-01
  • Spring超詳細(xì)講解AOP面向切面

    Spring超詳細(xì)講解AOP面向切面

    面向?qū)ο缶幊淌且环N編程方式,此編程方式的落地需要使用“類”和 “對(duì)象”來實(shí)現(xiàn),所以,面向?qū)ο缶幊唐鋵?shí)就是對(duì) “類”和“對(duì)象” 的使用,面向切面編程,簡(jiǎn)單的說,就是動(dòng)態(tài)地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程
    2022-10-10
  • java編程創(chuàng)建型設(shè)計(jì)模式單例模式的七種示例

    java編程創(chuàng)建型設(shè)計(jì)模式單例模式的七種示例

    這篇文章主要為大家介紹了java編程中創(chuàng)建型設(shè)計(jì)模式之單例模式的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02

最新評(píng)論

肥东县| 巴塘县| 新野县| 海盐县| 绥棱县| 双牌县| 巢湖市| 新昌县| 高台县| 吴江市| 洪洞县| 湖州市| 沂水县| 布拖县| 凤翔县| 平顺县| 元氏县| 长泰县| 丹江口市| 嘉义县| 五莲县| 茌平县| 永宁县| 康定县| 灌南县| 剑河县| 桂东县| 且末县| 东兴市| 沙湾县| 龙游县| 中山市| 太白县| 兴安县| 本溪| 萍乡市| 巩义市| 和林格尔县| 青海省| 嘉义市| 乌恰县|