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

SpringBoot操作spark處理hdfs文件的操作方法

 更新時間:2025年01月09日 11:56:45   作者:念言-ny  
本文介紹了如何使用Spring Boot操作Spark處理HDFS文件,包括導(dǎo)入依賴、配置Spark信息、編寫Controller和Service處理地鐵數(shù)據(jù)、運行項目以及觀察Spark和HDFS的狀態(tài),感興趣的朋友跟隨小編一起看看吧

SpringBoot操作spark處理hdfs文件

1、導(dǎo)入依賴

<!--        spark依賴-->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.12</artifactId>
            <version>3.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.12</artifactId>
            <version>3.2.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-mllib -->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-mllib_2.12</artifactId>
            <version>3.2.2</version>
        </dependency>

2、配置spark信息

建立一個配置文件,配置spark信息

import org.apache.spark.SparkConf;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//將文件交于spring管理
@Configuration
public class SparkConfig {
    //使用yml中的配置
    @Value("${spark.master}")
    private String sparkMaster;
    @Value("${spark.appName}")
    private String sparkAppName;
    @Value("${hdfs.user}")
    private String hdfsUser;
    @Value("${hdfs.path}")
    private String hdfsPath;
    @Bean
    public SparkConf sparkConf() {
        SparkConf conf = new SparkConf();
        conf.setMaster(sparkMaster);
        conf.setAppName(sparkAppName);
        // 添加HDFS配置
        conf.set("fs.defaultFS", hdfsPath);
        conf.set("spark.hadoop.hdfs.user",hdfsUser);
        return conf;
    }
    @Bean
    public SparkSession sparkSession() {
        return SparkSession.builder()
                .config(sparkConf())
                .getOrCreate();
    }
}

3、controller和service

controller類

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import xyz.zzj.traffic_main_code.service.SparkService;
@RestController
@RequestMapping("/spark")
public class SparkController {
    @Autowired
    private SparkService sparkService;
    @GetMapping("/run")
    public String runSparkJob() {
        //讀取Hadoop HDFS文件
        String filePath = "hdfs://192.168.44.128:9000/subwayData.csv";
        sparkService.executeHadoopSparkJob(filePath);
        return "Spark job executed successfully!";
    }
}

處理地鐵數(shù)據(jù)的service

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.types.DataTypes;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import xyz.zzj.traffic_main_code.service.SparkReadHdfs;
import java.io.IOException;
import java.net.URI;
import static org.apache.spark.sql.functions.*;
@Service
public class SparkReadHdfsImpl implements SparkReadHdfs {
    private final SparkSession spark;
    @Value("${hdfs.user}")
    private String hdfsUser;
    @Value("${hdfs.path}")
    private String hdfsPath;
    @Autowired
    public SparkReadHdfsImpl(SparkSession spark) {
        this.spark = spark;
    }
    /**
     * 讀取HDFS上的CSV文件并上傳到HDFS
     * @param filePath
     */
    @Override
    public void sparkSubway(String filePath) {
        try {
            // 設(shè)置Hadoop配置
            JavaSparkContext jsc = JavaSparkContext.fromSparkContext(spark.sparkContext());
            Configuration hadoopConf = jsc.hadoopConfiguration();
            hadoopConf.set("fs.defaultFS", hdfsPath);
            hadoopConf.set("hadoop.user.name", hdfsUser);
            // 讀取HDFS上的文件
            Dataset<Row> df = spark.read()
                    .option("header", "true") // 指定第一行是列名
                    .option("inferSchema", "true") // 自動推斷列的數(shù)據(jù)類型
                    .csv(filePath);
            // 顯示DataFrame的所有數(shù)據(jù)
//            df.show(Integer.MAX_VALUE, false);
            // 對DataFrame進行清洗和轉(zhuǎn)換操作
            // 檢查缺失值
            df.select("number", "people", "dateTime").na().drop().show();
            // 對數(shù)據(jù)進行類型轉(zhuǎn)換
            Dataset<Row> df2 = df.select(
                    col("number").cast(DataTypes.IntegerType),
                    col("people").cast(DataTypes.IntegerType),
                    to_date(col("dateTime"), "yyyy年MM月dd日").alias("dateTime")
            );
            // 去重
            Dataset<Row> df3 = df2.dropDuplicates();
            // 數(shù)據(jù)過濾,確保people列沒有負(fù)數(shù)
            Dataset<Row> df4 = df3.filter(col("people").geq(0));
//            df4.show();
            // 數(shù)據(jù)聚合,按dateTime分組,統(tǒng)計每天的總客流量
            Dataset<Row> df6 = df4.groupBy("dateTime").agg(sum("people").alias("total_people"));
//            df6.show();
            sparkForSubway(df6,"/time_subwayData.csv");
            //數(shù)據(jù)聚合,獲取每天人數(shù)最多的地鐵number
            Dataset<Row> df7 = df4.groupBy("dateTime").agg(max("people").alias("max_people"));
            sparkForSubway(df7,"/everyday_max_subwayData.csv");
            //數(shù)據(jù)聚合,計算每天的客流強度:每天總people除以632840
            Dataset<Row> df8 = df4.groupBy("dateTime").agg(sum("people").divide(632.84).alias("strength"));
            sparkForSubway(df8,"/everyday_strength_subwayData.csv");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private static void sparkForSubway(Dataset<Row> df6, String hdfsPath) throws IOException {
        // 保存處理后的數(shù)據(jù)到HDFS
        df6.coalesce(1)
                .write().mode("overwrite")
                .option("header", "true")
                .csv("hdfs://192.168.44.128:9000/time_subwayData");
        // 創(chuàng)建Hadoop配置
        Configuration conf = new Configuration();
        // 獲取FileSystem實例
        FileSystem fs = FileSystem.get(URI.create("hdfs://192.168.44.128:9000"), conf);
        // 定義臨時目錄和目標(biāo)文件路徑
        Path tempDir = new Path("/time_subwayData");
        FileStatus[] files = fs.listStatus(tempDir);
        // 檢查目標(biāo)文件是否存在,如果存在則刪除
        Path targetFile1 = new Path(hdfsPath);
        if (fs.exists(targetFile1)) {
            fs.delete(targetFile1, true); // true 表示遞歸刪除
        }
        for (FileStatus file : files) {
            if (file.isFile() && file.getPath().getName().startsWith("part-")) {
                Path targetFile = new Path(hdfsPath);
                fs.rename(file.getPath(), targetFile);
            }
        }
        // 刪除臨時目錄
        fs.delete(tempDir, true);
    }
}

4、運行

  • 項目運行完后,打開瀏覽器
    • spark處理地鐵數(shù)據(jù)
  • http://localhost:8686/spark/dispose
  • 觀察spark和hdfs
    • http://192.168.44.128:8099/
    • http://192.168.44.128:9870/explorer.html#/

到此這篇關(guān)于SpringBoot操作spark處理hdfs文件的文章就介紹到這了,更多相關(guān)SpringBoot spark處理hdfs文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中的Arrays這個工具類你真的會用嗎(一文秒懂)

    java中的Arrays這個工具類你真的會用嗎(一文秒懂)

    這篇文章主要介紹了java中的Arrays這個工具類你真的會用嗎,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Java線程變量ThreadLocal詳細(xì)解讀

    Java線程變量ThreadLocal詳細(xì)解讀

    這篇文章主要介紹了Java線程變量ThreadLocal詳細(xì)解讀,多線程訪問同一個變量的時候,很容易出現(xiàn)問題,特別是多線程對一個共享變量進行寫入的時候,為了線程的安全在進行數(shù)據(jù)寫入時候會進行數(shù)據(jù)的同步,需要的朋友可以參考下
    2024-01-01
  • Java中如何動態(tài)創(chuàng)建接口的實現(xiàn)方法

    Java中如何動態(tài)創(chuàng)建接口的實現(xiàn)方法

    這篇文章主要介紹了Java中如何動態(tài)創(chuàng)建接口的實現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • Spring實戰(zhàn)之使用@Resource配置依賴操作示例

    Spring實戰(zhàn)之使用@Resource配置依賴操作示例

    這篇文章主要介紹了Spring實戰(zhàn)之使用@Resource配置依賴操作,結(jié)合實例形式分析了Spring使用@Resource配置依賴具體步驟、實現(xiàn)及測試案例,需要的朋友可以參考下
    2019-12-12
  • Spring?WebFlux?核心作用

    Spring?WebFlux?核心作用

    Spring?WebFlux是Spring?Framework?5的響應(yīng)式框架,結(jié)合性能優(yōu)化與最佳實踐,構(gòu)建高效、可擴展的Web應(yīng)用,本節(jié)將深入探討?WebFlux?的核心功能,包括?REST?API?構(gòu)建、響應(yīng)式數(shù)據(jù)庫訪問和實時通信,感興趣的朋友一起看看吧
    2025-08-08
  • 淺談JAVA版本號的問題 Java版本號與JDk版本

    淺談JAVA版本號的問題 Java版本號與JDk版本

    這篇文章主要介紹了淺談JAVA版本號的問題 Java版本號與JDk版本,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java實現(xiàn)彩色圖片轉(zhuǎn)換為灰度圖片的示例代碼

    Java實現(xiàn)彩色圖片轉(zhuǎn)換為灰度圖片的示例代碼

    將彩色圖片轉(zhuǎn)換為灰度圖片是圖像處理中的常見操作,通常用于簡化圖像、增強對比度、或者進行后續(xù)的圖像分析,本項目的目標(biāo)是通過Java實現(xiàn)將彩色圖片轉(zhuǎn)換為灰度圖片,需要的朋友可以參考下
    2025-02-02
  • 深入理解Java三大特性中的多態(tài)

    深入理解Java三大特性中的多態(tài)

    多態(tài)性是對象多種表現(xiàn)形式的體現(xiàn)。在面向?qū)ο笾?,最常見的多態(tài)發(fā)生在使用父類的引用來引用子類的對象。下面這篇文章主要給大家深入的介紹了Java三大特性中多態(tài)的相關(guān)資料,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • mybatis-generator如何自定義注釋生成

    mybatis-generator如何自定義注釋生成

    這篇文章主要介紹了mybatis-generator如何自定義注釋生成的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java多線程編程小實例模擬停車場系統(tǒng)

    Java多線程編程小實例模擬停車場系統(tǒng)

    這是一個關(guān)于Java多線程編程的例子,用多線程的思想模擬停車場管理系統(tǒng),這里分享給大家,供需要的朋友參考。
    2017-10-10

最新評論

湟中县| 台山市| 丹棱县| 平度市| 开封县| 前郭尔| 名山县| 天津市| 海林市| 兴义市| 砚山县| 乐至县| 郯城县| 丹巴县| 赣州市| 顺昌县| 大田县| 陆川县| 霍山县| 唐海县| 龙川县| 古丈县| 名山县| 福鼎市| 阆中市| 潢川县| 彭泽县| 台南县| 会泽县| 龙山县| 广灵县| 云龙县| 苍南县| 大关县| 杭州市| 揭东县| 原阳县| 庐江县| 突泉县| 永泰县| 陇西县|