SpringBoot使用Spark過程詳解
前提: 可以參考文章 SpringBoot 接入 Spark
- SpringBoot 已經接入 Spark
- 已配置 JavaSparkContext
- 已配置 SparkSession
@Resource private SparkSession sparkSession; @Resource private JavaSparkContext javaSparkContext;
讀取 txt 文件
測試文件 word.txt

java 代碼
- textFile:獲取文件內容,返回 JavaRDD
- flatMap:過濾數據
- mapToPair:把每個元素都轉換成一個<K,V>類型的對象,如 <123,1>,<456,1>
- reduceByKey:對相同key的數據集進行預聚合
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);
//輸出結果
List<Tuple2<String, Integer>> result = wordAndCountRDD.collect();
result.forEach(System.out::println);
}
結果得出,123 有 3 個,456 有 2 個,789 有 1 個

讀取 csv 文件
測試文件 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());
//輸出結果
System.out.println(wordsRDD.collect());
}
輸出結果

讀取 MySQL 數據庫表
- format:獲取數據庫建議是 jdbc
- option.url:添加 MySQL 連接 url
- option.user:MySQL 用戶名
- option.password:MySQL 用戶密碼
- option.dbtable:sql 語句
- option.driver:數據庫 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();
//轉化為RDD
JavaRDD<Row> rowJavaRDD = jdbcDF.javaRDD();
System.out.println(rowJavaRDD.collect());
}
也可以把表內容輸出到文件,添加以下代碼
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();
結果輸出

讀取 Json 文件
測試文件 testjson.json,內容如下
[{
"name": "name1",
"age": "1"
}, {
"name": "name2",
"age": "2"
}, {
"name": "name3",
"age": "3"
}, {
"name": "name4",
"age": "4"
}]
注意:testjson.json 文件的內容不能帶格式,需要進行壓縮

java 代碼
- createOrReplaceTempView:讀取 json 數據后,創(chuàng)建數據表 t
- sparkSession.sql:使用 sql 對 t 進行查詢,輸出 age 大于 3 的數據
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());
}
輸出結果

中文輸出亂碼
測試文件 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());
//輸出結果
System.out.println(wordsRDD.collect());
}
輸出結果,發(fā)現中文亂碼,可惡

原因:textFile 讀取文件沒有解決亂碼問題,但 sparkSession.read() 卻不會亂碼
解決辦法:獲取文件方式由 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());
//輸出結果
System.out.println(gbkWordsRDD.collect());
}
輸出結果

到此這篇關于SpringBoot使用Spark過程詳解的文章就介紹到這了,更多相關SpringBoot Spark內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java abstract class interface之間的區(qū)別介紹
含有abstract修飾符的class即為抽象類,abstract 類不能創(chuàng)建的實例對象,abstract class類中定義抽象方法必須在具體(Concrete)子類中實現,所以,不能有抽象構造方法或抽象靜態(tài)方法2012-11-11
spring?cloud?eureka注冊原理-注冊失敗填坑筆記
這篇文章主要介紹了spring?cloud?eureka注冊原理-注冊失敗填坑筆記,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
java.util.NoSuchElementException原因及兩種解決方法
本文主要介紹了java.util.NoSuchElementException原因及兩種解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06

