SpringBoot使用Spark过程详解

 更新时间:2023年02月15日 10:46:31   作者:我有一只肥螳螂  
这篇文章主要介绍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 数据后,创建数据表 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());
}

输出结果,发现中文乱码,可恶

原因: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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用JPA进行CriteriaQuery进行查询的注意事项

    使用JPA进行CriteriaQuery进行查询的注意事项

    这篇文章主要介绍了使用JPA进行CriteriaQuery进行查询的注意事项,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java设置JSON字符串参数编码的示例详解

    Java设置JSON字符串参数编码的示例详解

    在Java中创建JSON字符串,我们可以使用多个库,其中最流行的是Jackson、Gson和org.json,,下面给大家分享Java设置JSON字符串参数编码的示例,感兴趣的朋友一起看看吧
    2024-06-06
  • spring cloud 配置中心客户端启动遇到的问题

    spring cloud 配置中心客户端启动遇到的问题

    这篇文章主要介绍了spring cloud 配置中心客户端启动遇到的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java 内部类的定义与范例

    Java 内部类的定义与范例

    说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉。原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法。今天我们就来一探究竟
    2021-11-11
  • MyBatis学习教程(二)—如何使用MyBatis对users表执行CRUD操作

    MyBatis学习教程(二)—如何使用MyBatis对users表执行CRUD操作

    这篇文章主要介绍了MyBatis学习教程(二)—如何使用MyBatis对users表执行CRUD操作的相关资料,需要的朋友可以参考下
    2016-05-05
  • Java 实现Redis存储复杂json格式数据并返回给前端

    Java 实现Redis存储复杂json格式数据并返回给前端

    这篇文章主要介绍了Java 实现Redis存储复杂json格式数据并返回给前端操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Java文件操作之序列化与对象处理流详解

    Java文件操作之序列化与对象处理流详解

    这篇文章主要为大家详细介绍了Java文件操作中的序列化与对象处理流,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-09-09
  • Java使用JXLS导出Excel详解

    Java使用JXLS导出Excel详解

    jxls是一个轻量级的Java库,用于基于模板的Excel报表生成,这篇文章主要为大家介绍了Java如何使用JXLS导出Excel,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11
  • java使用lambda表达式多条件排序方式

    java使用lambda表达式多条件排序方式

    这篇文章主要介绍了java使用lambda表达式多条件排序方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • SpringBoot服务设置禁止server.point端口的使用

    SpringBoot服务设置禁止server.point端口的使用

    本文主要介绍了SpringBoot服务设置禁止server.point端口的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01

最新评论