SpringBoot使用Spark過(guò)程詳解
前提: 可以參考文章 SpringBoot 接入 Spark
- SpringBoot 已經(jīng)接入 Spark
- 已配置 JavaSparkContext
- 已配置 SparkSession
@Resource private SparkSession sparkSession; @Resource private JavaSparkContext javaSparkContext;
讀取 txt 文件
測(cè)試文件 word.txt
java 代碼
- textFile:獲取文件內(nèi)容,返回 JavaRDD
- flatMap:過(guò)濾數(shù)據(jù)
- mapToPair:把每個(gè)元素都轉(zhuǎn)換成一個(gè)<K,V>類型的對(duì)象,如 <123,1>,<456,1>
- reduceByKey:對(duì)相同key的數(shù)據(jù)集進(jìn)行預(yù)聚合
public void testSparkText() { String file = "D:\\TEMP\\word.txt"; JavaRDD<String> fileRDD = javaSparkContext.textFile(file); JavaRDD<String> wordsRDD = fileRDD.flatMap(line -> Arrays.asList(line.split(" ")).iterator()); JavaPairRDD<String, Integer> wordAndOneRDD = wordsRDD.mapToPair(word -> new Tuple2<>(word, 1)); JavaPairRDD<String, Integer> wordAndCountRDD = wordAndOneRDD.reduceByKey((a, b) -> a + b); //輸出結(jié)果 List<Tuple2<String, Integer>> result = wordAndCountRDD.collect(); result.forEach(System.out::println); }
結(jié)果得出,123 有 3 個(gè),456 有 2 個(gè),789 有 1 個(gè)
讀取 csv 文件
測(cè)試文件 testcsv.csv
java 代碼
public void testSparkCsv() { String file = "D:\\TEMP\\testcsv.csv"; JavaRDD<String> fileRDD = javaSparkContext.textFile(file); JavaRDD<String> wordsRDD = fileRDD.flatMap(line -> Arrays.asList(line.split(",")).iterator()); //輸出結(jié)果 System.out.println(wordsRDD.collect()); }
輸出結(jié)果
讀取 MySQL 數(shù)據(jù)庫(kù)表
- format:獲取數(shù)據(jù)庫(kù)建議是 jdbc
- option.url:添加 MySQL 連接 url
- option.user:MySQL 用戶名
- option.password:MySQL 用戶密碼
- option.dbtable:sql 語(yǔ)句
- option.driver:數(shù)據(jù)庫(kù) driver,MySQL 使用 com.mysql.cj.jdbc.Driver
public void testSparkMysql() throws IOException { Dataset<Row> jdbcDF = sparkSession.read() .format("jdbc") .option("url", "jdbc:mysql://192.168.140.1:3306/user?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai") .option("dbtable", "(SELECT * FROM xxxtable) tmp") .option("user", "root") .option("password", "xxxxxxxxxx*k") .option("driver", "com.mysql.cj.jdbc.Driver") .load(); jdbcDF.printSchema(); jdbcDF.show(); //轉(zhuǎn)化為RDD JavaRDD<Row> rowJavaRDD = jdbcDF.javaRDD(); System.out.println(rowJavaRDD.collect()); }
也可以把表內(nèi)容輸出到文件,添加以下代碼
List<Row> list = rowJavaRDD.collect(); BufferedWriter bw; bw = new BufferedWriter(new FileWriter("d:/test.txt")); for (int j = 0; j < list.size(); j++) { bw.write(list.get(j).toString()); bw.newLine(); bw.flush(); } bw.close();
結(jié)果輸出
讀取 Json 文件
測(cè)試文件 testjson.json,內(nèi)容如下
[{ "name": "name1", "age": "1" }, { "name": "name2", "age": "2" }, { "name": "name3", "age": "3" }, { "name": "name4", "age": "4" }]
注意:testjson.json 文件的內(nèi)容不能帶格式,需要進(jìn)行壓縮
java 代碼
- createOrReplaceTempView:讀取 json 數(shù)據(jù)后,創(chuàng)建數(shù)據(jù)表 t
- sparkSession.sql:使用 sql 對(duì) t 進(jìn)行查詢,輸出 age 大于 3 的數(shù)據(jù)
public void testSparkJson() { Dataset<Row> df = sparkSession.read().json("D:\\TEMP\\testjson.json"); df.printSchema(); df.createOrReplaceTempView("t"); Dataset<Row> row = sparkSession.sql("select age,name from t where age > 3"); JavaRDD<Row> rowJavaRDD = row.javaRDD(); System.out.println(rowJavaRDD.collect()); }
輸出結(jié)果
中文輸出亂碼
測(cè)試文件 testcsv.csv
public void testSparkCsv() { String file = "D:\\TEMP\\testcsv.csv"; JavaRDD<String> fileRDD = javaSparkContext.textFile(file); JavaRDD<String> wordsRDD = fileRDD.flatMap(line -> Arrays.asList(line.split(",")).iterator()); //輸出結(jié)果 System.out.println(wordsRDD.collect()); }
輸出結(jié)果,發(fā)現(xiàn)中文亂碼,可惡
原因:textFile 讀取文件沒(méi)有解決亂碼問(wèn)題,但 sparkSession.read() 卻不會(huì)亂碼
解決辦法:獲取文件方式由 textFile 改成 hadoopFile,由 hadoopFile 指定具體編碼
public void testSparkCsv() { String file = "D:\\TEMP\\testcsv.csv"; String code = "gbk"; JavaRDD<String> gbkRDD = javaSparkContext.hadoopFile(file, TextInputFormat.class, LongWritable.class, Text.class).map(p -> new String(p._2.getBytes(), 0, p._2.getLength(), code)); JavaRDD<String> gbkWordsRDD = gbkRDD.flatMap(line -> Arrays.asList(line.split(",")).iterator()); //輸出結(jié)果 System.out.println(gbkWordsRDD.collect()); }
輸出結(jié)果
到此這篇關(guān)于SpringBoot使用Spark過(guò)程詳解的文章就介紹到這了,更多相關(guān)SpringBoot Spark內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java將json字符串轉(zhuǎn)換為數(shù)組的幾種方法
在Java開發(fā)中,經(jīng)常會(huì)遇到將json字符串轉(zhuǎn)換為數(shù)組的需求,本文主要介紹了Java將json字符串轉(zhuǎn)換為數(shù)組的幾種方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01詳解如何使用tldb數(shù)據(jù)庫(kù)的java客戶端
這篇文章主要為大家介紹了如何使用tldb數(shù)據(jù)庫(kù)的java客戶端過(guò)程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09java abstract class interface之間的區(qū)別介紹
含有abstract修飾符的class即為抽象類,abstract 類不能創(chuàng)建的實(shí)例對(duì)象,abstract class類中定義抽象方法必須在具體(Concrete)子類中實(shí)現(xiàn),所以,不能有抽象構(gòu)造方法或抽象靜態(tài)方法2012-11-11spring?cloud?eureka注冊(cè)原理-注冊(cè)失敗填坑筆記
這篇文章主要介紹了spring?cloud?eureka注冊(cè)原理-注冊(cè)失敗填坑筆記,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05java.util.NoSuchElementException原因及兩種解決方法
本文主要介紹了java.util.NoSuchElementException原因及兩種解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06解決idea找不到或無(wú)法加載主類的錯(cuò)誤處理
這篇文章主要介紹了解決idea找不到或無(wú)法加載主類的錯(cuò)誤處理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04