SpringBoot 使用 Spark

news2024/9/22 11:42:56

文章目录

  • 读取 txt 文件
  • 读取 csv 文件
  • 读取 MySQL 数据库表
  • 读取 Json 文件
  • 中文输出乱码

前提: 可以参考文章 SpringBoot 接入 Spark

  1. SpringBoot 已经接入 Spark
  2. 已配置 JavaSparkContext
  3. 已配置 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());
    }

输出结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/343147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习算法:随机森林

在经典机器学习中&#xff0c;随机森林一直是一种灵丹妙药类型的模型。 该模型很棒有几个原因&#xff1a; 与许多其他算法相比&#xff0c;需要较少的数据预处理&#xff0c;因此易于设置充当分类或回归模型不太容易过度拟合可以轻松计算特征重要性在本文[1]中&#xff0c;我想…

【docker知识】从容器中如何访问到宿主机

一、说明 使用 Docker 能实现服务的容器化&#xff0c;并使用容器间网络在它们之间进行通信。有时您可能需要一个容器来与宿主机上非容器化的服务通信。以下是如何从 Docker 容器中访问本地主机或 127.0.0.1的具体方法。 二、方法1&#xff1a;简单的选择 适用于 Windows 和 Ma…

2023/2/13总结

今天主要学习了哈夫曼树。 哈夫曼树 哈夫曼树是二叉树的一种&#xff0c;它是一种WPL最优二叉树。 叶子结点&#xff08;也称叶节点&#xff09;&#xff1a;指的是自己下面不再连接有节点的节点&#xff08;即末端&#xff09;&#xff0c;称为叶子节点&#xff08;又称为终…

PDF内容提取器:ByteScout PDF Extractor SDK Crack

ByteScout PDF Extractor SDK – 用于 PDF 到 JSON、PDF 到 Excel、CSV、XML、从 .NET 和 ASP.NET 从 PDF 中提取文本的 PDF 提取器库 ByteScout PDF Extractor SDK – 用于 PDF 到 JSON、PDF 到 Excel、CSV、XML、从 .NET 和 ASP.NET 从 PDF 中提取文本的 PDF 提取器库​ ​ ​…

test4

网络层故障分析 一、 路由器故障 a.主要用途简述 b.故障 & 故障原因 & 解决方案 1&#xff09;路由器的部分功能无法实现 故障故障原因解决方案路由器配置完全正确&#xff0c;但是有些功能却不能实现。路由器的软件系统出现问题升级软件系统 2&#xff09;网络频繁…

ABC 289 G - Shopping in AtCoder store 数学推导+凸包

大意&#xff1a; n个顾客&#xff0c;每个人有一个购买的欲望bi,m件物品&#xff0c;每一件物品有一个价值ci,每一个顾客会买商品当且仅当bici>定价. 现在要求对每一个商品定价&#xff0c;求出它的最大销售值&#xff08;数量*定价&#xff09; n,m<2e5 思路&#x…

工程监测多通道振弦模拟信号采集仪VTN常规操作

工程监测多通道振弦模拟信号采集仪VTN常规操作 一、开关机 1、开机 VTN4XX 有四个开机途径&#xff0c;手动开机、自动定时开机和上电开机、信号触发开机。 上电开机&#xff1a;当“工作模式拨码开关” 第 4 位为 ON 时&#xff0c;直接连接外部电源即可开机。 自动开机&…

JAVA文件上传多方式

1.文件上传接收文件接口 通过post接口&#xff0c;上传文件 PostMapping(value "/uploadFile")ApiOperation(value "文件上传", notes "文件上传")public Result uploadFile(RequestParam (name "file") MultipartFile file) thr…

【知识图谱论文】Bi-Link:通过转换器和提示的对比学习桥接来自文本的归纳链接预测

文献题目&#xff1a;Bi-Link: Bridging Inductive Link Predictions from Text via Contrastive Learning of Transformers and Prompts发表期刊&#xff1a;WWW2023代码&#xff1a; https://anonymous.4open.science/r/Bi-Link-2277/. 摘要 归纳知识图的完成需要模型来理解…

如何通过 9 个简单步骤创建网站

您可以在 20 分钟内创建一个网站。您也不需要成为技术向导。不管是商务还是休闲。您不需要花哨的设计师或昂贵的开发人员。只需按照以下简单步骤操作&#xff0c;您就可以立即上线。 顶级虚拟主机提供商创建网站如果你想创建一个网站&#xff0c;你需要一个网络托管服务提供商。…

图机器学习

图机器学习1、图机器学习导论1.1图神经网络与普通神经网络的异同2、图的基本表示和特征工程2.1 图的基本表示2.1.1 图的本体设计2.1.2 图的种类2.1.3节点连接数&#xff08;度&#xff09;2.1.4图的基本表示&#xff08;邻接矩阵&#xff09;节点数量少使用2.1.5图的基本表示&a…

【GD32F427开发板试用】5. SPI驱动TFTLCD屏幕

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;hehung 之前发帖 【GD32F427开发板试用】1. 串口实现scanf输入控制LED 【GD32F427开发板试用】2. RT-Thread标准版移植 【GD32F427开发板试用…

IB学习者的培养目标有哪些?

IB课程强调要培养年轻人的探究精神&#xff0c;在富有渊博知识的同时&#xff0c;更要勤于思考&#xff0c;敢于思考&#xff0c;尊重和理解跨文化的差异&#xff0c;坚持原则维护公平&#xff0c;让这个世界充满爱与和平&#xff0c;让这个世界变得更加美好。上一次我们为大家…

编译原理—翻译方案、属性栈代码

系列文章戳这里&#x1f447; 什么是上下文无关文法、最左推导和最右推导如何判断二义文法及消除文法二义性何时需要消除左递归什么是句柄、什么是自上而下、自下而上分析什么是LL(1)、LR(0)、LR(1)文法、LR分析表LR(0)、SLR(1)、LR(1)、LALR(1)文法之间的关系编译原理第三章习…

JavaSE学习day5_01 方法(也叫函数)

在学习方法之前&#xff0c;我们扩展一点关于数组的知识&#xff0c;就是数组的内存图;先看一张图&#xff1a; 可知一个程序在内存中运行时&#xff0c;内存是划分为几个区的&#xff0c;方法在栈区&#xff0c;看到new这个单词&#xff0c;在创建对象的时候会在内存中开辟一块…

如何做好多项目全生命周期的资源调配,提升资源利用效率?【橙子】

随着产品研发中心各团队承接的研发项目数量和规模日趋增加&#xff0c;人均产值和利润目标逐步提升&#xff0c;人均承接的项目数量也逐渐增加&#xff0c;目前缺乏合理的研发资源管理方案&#xff0c;存在多项目研发过程中资源冲突及部分项目研发人员忙闲不均等现象&#xff0…

微电影行业痛点解决方案

在当下新媒体时代&#xff0c;微电影作为“微文化”的载体&#xff0c;具有“微”的特点&#xff0c;经过短短数年的快速发展&#xff0c;并获得了受众广泛的关注和喜爱&#xff0c;对人们的休闲娱乐方式也产生较大的影响。但在迅猛发展的同时也存在一些行业痛点&#xff0c;诸…

第十一天栈与队列

20. 有效的括号力扣题目链接(opens new window)给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串&#xff0c;判断字符串是否有效。有效字符串需满足&#xff1a;左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。…

【GPLT 三阶题目集】L3-013 非常弹的球

刚上高一的森森为了学好物理&#xff0c;买了一个“非常弹”的球。虽然说是非常弹的球&#xff0c;其实也就是一般的弹力球而已。森森玩了一会儿弹力球后突然想到&#xff0c;假如他在地上用力弹球&#xff0c;球最远能弹到多远去呢&#xff1f;他不太会&#xff0c;你能帮他解…

Liunx--线程池的实现--0208 09

1. 线程池的了解 预先申请线程。线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务&#xff0c;这避免了在处理短时间任务时创建与销毁线程的代价。 2.线程池框架 2.1 线程的封装 首先我们需要写线程的构造函数&#xff0c;他的编号是什么&#xff0c;…