Spark3 学习【基于Java】4. Spark-Sql数据源
通过DF,Spark可以跟大量各型的数据源(文件/数据库/大数据)进行交互。前面我们已经看到DF可以生成视图,这就是一个非常使用的功能。
简单的读写流程如下:
通过read方法拿到DataFrameReader对象,与之类似的就有DataFrameWriter对象,通过DF的write方法拿到,通过其save方法将数据保存到文件或数据库。
Spark官方列出的支持的数据格式有:
- parquet,这是Apache的一种序列化格式,我没有用过
- json
- text
- csv,逗号或其他分隔符分割的text
- orc,也是apache的一种数据格式,没有用过
- avro,也是apache的一种数据格式,没有用过
- JDBC,spark也是Java的,支持jdbc数据源天经地义
- Hive,它本来就干这个的
我们来尝试几个例子。
JSON
我们的json文件还是之前那种不规范格式,我期望读到DF后能变成规范的格式:
- Dataset<Row> json = session.read().json("spark-core/src/main/resources/people.json");
- json.show();
- json.write().save("spark-core/src/main/resources/people.json");
这样执行会报错,说文件已经存在。
于是换一个文件people1.json,这样会生成一个文件夹people1.json,而任务报错:
到https://github.com/steveloughran/winutils/blob/master/hadoop-3.0.0/bin 下载hadoop.dll到hadoop的bin目录,执行了一下倒是没报错(看来只是win系统的原因,linux应该不报错吧),产生了一个文件夹:
真奇怪,为什么spark非要使用parquet呢?可这样保存了该咋用呢?
parquet
根据 Parquet Files - Spark 3.2.0 Documentation (apache.org) 的说明,Parquet是apache的一款列式存储数据文件。spark会自动解析它的格式(有哪些字段),并把每一列都作为可空的。主要还是在hadoop相关的环境下使用。
上面生成的parquet文件时可以直接读取的。和读取json文件一样,spark提供了parquet()方法:
除了save方法,spark也支持通过parquet方法直接保存:
JDBC
这种方式对于我们来说可能是使用最多的。从数据库中读取数据,经过处理再写回到数据库。
使用JDBC连接有两种方法,第一种方法是通过option传入连接参数:
- DataFrameReader jdbc = session.read().format("jdbc");
- jdbc.option("url", "jdbc:mysql://localhost:3306/enn");
- jdbc.option("dbtable", "config_info");
- jdbc.option("user", "root");
- jdbc.option("password", "123456");
- Dataset<Row> jdbcDf = jdbc.load();
- jdbcDf.show();
直接执行会报错,因为找不到数据库驱动
通过maven引入驱动(实际开发中如果不是使用maven项目,需要把驱动jar包放到服务器上指定classpath)即可成功
除了option参数,spark还提供了通过Jdbc方法来生成DF,这样没有load的显式过程:
可以看到代码更短更面向对象,所以推荐第二种。
另外库名可以放到url中也可以放到表名前面。下面这样也可以,这是驱动提供的能力,和编码无关
现在要把一个DF保存到数据库,使用write即可:
注意要保存的表不能提前存在,不然会说表已经有了。那spark自己怎么创建表呢?它会根据推断的类型创建一个字段都可空的表:
如果想追加数据呢?总不能每次都创建新表吧。可以使用mode方法指定,可以看到插入了两遍:
还有一个问题是汉字编码问题,我们需要指定一下:
这里使用一张已经存在的表,表定义是复制的原始表:
Spark3 学习【基于Java】4. Spark-Sql数据源的更多相关文章
- Spark SQL数据源
[TOC] 背景 Spark SQL是Spark的一个模块,用于结构化数据的处理. ++++++++++++++ +++++++++++++++++++++ | SQL | | Dataset API ...
- 4. Spark SQL数据源
4.1 通用加载/保存方法 4.1.1手动指定选项 Spark SQL的DataFrame接口支持多种数据源的操作.一个DataFrame可以进行RDDs方式的操作,也可以被注册为临时表.把DataF ...
- spark sql数据源--hive
使用的是idea编辑器 spark sql从hive中读取数据的步骤:1.引入hive的jar包 2.将hive-site.xml放到resource下 3.spark sql声明对hive的支持 案 ...
- 大数据技术之_19_Spark学习_03_Spark SQL 应用解析 + Spark SQL 概述、解析 、数据源、实战 + 执行 Spark SQL 查询 + JDBC/ODBC 服务器
第1章 Spark SQL 概述1.1 什么是 Spark SQL1.2 RDD vs DataFrames vs DataSet1.2.1 RDD1.2.2 DataFrame1.2.3 DataS ...
- Apache Spark 2.2.0 中文文档 - Spark SQL, DataFrames and Datasets Guide | ApacheCN
Spark SQL, DataFrames and Datasets Guide Overview SQL Datasets and DataFrames 开始入门 起始点: SparkSession ...
- Apache Spark 2.2.0 中文文档 - Spark SQL, DataFrames and Datasets
Spark SQL, DataFrames and Datasets Guide Overview SQL Datasets and DataFrames 开始入门 起始点: SparkSession ...
- DataFrame编程模型初谈与Spark SQL
Spark SQL在Spark内核基础上提供了对结构化数据的处理,在Spark1.3版本中,Spark SQL不仅可以作为分布式的SQL查询引擎,还引入了新的DataFrame编程模型. 在Spark ...
- Spark3学习入门【基于Java】
Spark 是离线数据处理的一种大数据技术,和Flick相比数据处理要延后,因为Flick是实时数据处理,而Spark需要先读取数据到内存. Spark的库是基于Scala写的,虽然Scala也是运行 ...
- spark SQL学习(数据源之json)
准备工作 数据文件students.json {"id":1, "name":"leo", "age":18} {&qu ...
- Spark学习之路(十)—— Spark SQL 外部数据源
一.简介 1.1 多数据源支持 Spark支持以下六个核心数据源,同时Spark社区还提供了多达上百种数据源的读取方式,能够满足绝大部分使用场景. CSV JSON Parquet ORC JDBC/ ...
随机推荐
- vue路由跳转的三种方式
目录 1.router-link [实现跳转最简单的方法] 2.this.$router.push({ path:'/user'}) 3.this.$router.replace{path:'/' } ...
- linux下nginx安装和配置
一.软件安装 1.环境说明 操作系统:CentOS 7.4 64位 nginx版本:1.16.1 安装日期:2019/10/01 安装用户:root 2.安装运行库 yum -y install gc ...
- AeroAdmin、TeamViewer和Splashtop Business Access的区别
Hi everyone! 今天又是喜闻乐见的吃瓜时间,王婆卖瓜,不得不夸. 炎炎夏日,就给大家送个大西瓜吧.望梅止渴也是极好的. ------官宣分割线------ Splashtop是针对个人和企 ...
- angular路由跳转并传值的多种方式
Angular的学习使用过程中,路由跳转支撑了项目的全过程,所以路由跳转是一个很常见也是一个很容易忽略的点,,对于页面之间的跳转有着很多的问题,跳转的方式/如何携带参数跳转,下面是自己在学习过程中对a ...
- pageoffice6 实现在线模板套红
在Web项目中处理Word文档,经常会用到Word模板,只不过这里的"模板"概念,都是指在Web项目中预先放置的doc.docx等扩展名的.真正的Word文档,对于Excel和PP ...
- docker多主机管理docker-machine
docker-machine https://docs.docker.com/machine/ https://www.runoob.com/docker/docker-machine.html ht ...
- C#复杂类型转为QueryString
使用 visual studio 创建 webapi 项目,并添加 DefaultController.cs,代码如下 public class DefaultController : ApiCont ...
- kubernetes的三种探针startupprobe,ReadinessProbe,LivenessProbe记录
kubernetes的三种探针 startupprobe: k8s1.16版本后新加的探测方式,用于判断容器内应用程序是否已经启动,如果配置了startuprobe,就会先禁用其他的探测,直到它成功为 ...
- Vue3.0+typescript+Vite+Pinia+Element-plus搭建vue3框架!
使用 Vite 快速搭建脚手架 命令行选项直接指定项目名称和想要使用的模板,Vite + Vue 项目,运行(推荐使用yarn) # npm 6.x npm init vite@latest my-v ...
- Mysql 使用 group by 不对 null 做分组
在项目开发查询数据需要将相同的数据做合并处理,但是字段为null,不做合并. 创建表以及添加数据 create table t_student( `id` int not null primary k ...