通过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后能变成规范的格式:

  1. Dataset<Row> json = session.read().json("spark-core/src/main/resources/people.json");
  2. json.show();
  3. json.write().save("spark-core/src/main/resources/people.json");

这样执行会报错,说文件已经存在。

于是换一个文件people1.json,这样会生成一个文件夹people1.json,而任务报错:

网上找了一个答案试一下:Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z - Stack Overflow

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传入连接参数:

  1. DataFrameReader jdbc = session.read().format("jdbc");
  2. jdbc.option("url", "jdbc:mysql://localhost:3306/enn");
  3. jdbc.option("dbtable", "config_info");
  4. jdbc.option("user", "root");
  5. jdbc.option("password", "123456");
  6. Dataset<Row> jdbcDf = jdbc.load();
  7. jdbcDf.show();

直接执行会报错,因为找不到数据库驱动

通过maven引入驱动(实际开发中如果不是使用maven项目,需要把驱动jar包放到服务器上指定classpath)即可成功

除了option参数,spark还提供了通过Jdbc方法来生成DF,这样没有load的显式过程:

可以看到代码更短更面向对象,所以推荐第二种。

另外库名可以放到url中也可以放到表名前面。下面这样也可以,这是驱动提供的能力,和编码无关

现在要把一个DF保存到数据库,使用write即可:

注意要保存的表不能提前存在,不然会说表已经有了。那spark自己怎么创建表呢?它会根据推断的类型创建一个字段都可空的表:

如果想追加数据呢?总不能每次都创建新表吧。可以使用mode方法指定,可以看到插入了两遍:

还有一个问题是汉字编码问题,我们需要指定一下:

这里使用一张已经存在的表,表定义是复制的原始表:

Spark3 学习【基于Java】4. Spark-Sql数据源的更多相关文章

  1. Spark SQL数据源

    [TOC] 背景 Spark SQL是Spark的一个模块,用于结构化数据的处理. ++++++++++++++ +++++++++++++++++++++ | SQL | | Dataset API ...

  2. 4. Spark SQL数据源

    4.1 通用加载/保存方法 4.1.1手动指定选项 Spark SQL的DataFrame接口支持多种数据源的操作.一个DataFrame可以进行RDDs方式的操作,也可以被注册为临时表.把DataF ...

  3. spark sql数据源--hive

    使用的是idea编辑器 spark sql从hive中读取数据的步骤:1.引入hive的jar包 2.将hive-site.xml放到resource下 3.spark sql声明对hive的支持 案 ...

  4. 大数据技术之_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 ...

  5. Apache Spark 2.2.0 中文文档 - Spark SQL, DataFrames and Datasets Guide | ApacheCN

    Spark SQL, DataFrames and Datasets Guide Overview SQL Datasets and DataFrames 开始入门 起始点: SparkSession ...

  6. Apache Spark 2.2.0 中文文档 - Spark SQL, DataFrames and Datasets

    Spark SQL, DataFrames and Datasets Guide Overview SQL Datasets and DataFrames 开始入门 起始点: SparkSession ...

  7. DataFrame编程模型初谈与Spark SQL

    Spark SQL在Spark内核基础上提供了对结构化数据的处理,在Spark1.3版本中,Spark SQL不仅可以作为分布式的SQL查询引擎,还引入了新的DataFrame编程模型. 在Spark ...

  8. Spark3学习入门【基于Java】

    Spark 是离线数据处理的一种大数据技术,和Flick相比数据处理要延后,因为Flick是实时数据处理,而Spark需要先读取数据到内存. Spark的库是基于Scala写的,虽然Scala也是运行 ...

  9. spark SQL学习(数据源之json)

    准备工作 数据文件students.json {"id":1, "name":"leo", "age":18} {&qu ...

  10. Spark学习之路(十)—— Spark SQL 外部数据源

    一.简介 1.1 多数据源支持 Spark支持以下六个核心数据源,同时Spark社区还提供了多达上百种数据源的读取方式,能够满足绝大部分使用场景. CSV JSON Parquet ORC JDBC/ ...

随机推荐

  1. deepin下的系统,如何为root用户添加密码

  2. WEB服务与NGINX(2)-NGINX的I/O模型

    WEB服务与NGINX(2)-NGINX的I/O模型 目录 WEB服务与NGINX(2)-NGINX的I/O模型 1. linux I/0模型及在NGINX中的应用 1.1 I/O模型概述 1.2 系 ...

  3. SQL——连续出现的数字

    SQL三个排序函数 ROW_NUMBER().RANK().DENSE_RANK() ROW_NUMBER()不并列 连续的 RANK()分组不连续排序(跳跃排序) DENSE_RANK()并列连续 ...

  4. layui表格内可编辑下拉框

    表格内可编辑下拉框扩展自别人的表格内下拉框 一.列模板,这是列配置的templet字段需要使用的. 1.inputdiv,输入框覆盖在下拉框上面左半部.这个样式用来调整输入框和下拉框不会超出单元格. ...

  5. git cherry-pick合并其它分支的某次提交(commits)到当前分支

    git cherry-pick 可以选择某一个分支中的一个或几个commit(s)来进行操作. 例如,假设我们有个稳定版本的分支,叫v2.0.0,另外还有个开发版本的分支v3.0.0,我们不能直接把两 ...

  6. 一文详解编辑距离(Levenshtein Distance)

    更多博文请关注:https://blog.bigcoder.cn 一. 什么是Levenshtein Distance Levenshtein Distance,一般称为编辑距离(Edit Dista ...

  7. Vue 页面传参方式 Query 和 Params

    1. query 与 params 传参 query 需要和配合 path 属性使用,携带参数会拼接在请求路径后,效果同 Get 请求方式 http://localhost:8033/Permissi ...

  8. uniapp 添加操作

    1 分析: 2 需要动态的向数据库中插入数据,既然要进行添加操作,就会触发一个点击的事件,所以我们的第一步就是要先绑定事件 3 向服务器进行请求接口操作,请求的方法为 'POST' 4 最后就是在me ...

  9. 代码审计——基础(JAVAWEB)

    JAVAWEB 目录 JAVAWEB Servlet技术 JavaWeb概述 Servelt与Servlet容器 Servlet概念 Tomcat Web程序结构 Servlet容器响应客户请求的过程 ...

  10. 剑指Offer-57.二叉树的下一个结点(C++/Java)

    题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 分析: 二叉树的中序遍历是左根右,所以如果一个结点的右子 ...