Spark3 学习【基于Java】4. Spark-Sql数据源

Spark3 学习【基于Java】4. Spark-Sql数据源通过DF,Spark可以跟大量各型的数据源(文件/数据库/大数据)进行交互。前面我们已经看到DF可以生成视图,这就是一个非常使用的功能。 简单的读写流程如下: 通过read方法拿到DataFrameR

Spark3 学习【基于Java】4. Spark-Sql数据源

通过DF,Spark可以跟大量各型的数据源(文件/数据库/大数据)进行交互。前面我们已经看到DF可以生成视图,这就是一个非常使用的功能。

简单的读写流程如下:

Spark3 学习【基于Java】4. Spark-Sql数据源

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

Spark3 学习【基于Java】4. Spark-Sql数据源

  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“);

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

Spark3 学习【基于Java】4. Spark-Sql数据源

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

Spark3 学习【基于Java】4. Spark-Sql数据源

网上找了一个答案试一下: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应该不报错吧),产生了一个文件夹:

Spark3 学习【基于Java】4. Spark-Sql数据源

真奇怪,为什么spark非要使用parquet呢?可这样保存了该咋用呢?

parquet

根据 Parquet Files – Spark 3.2.0 Documentation (apache.org) 的说明,Parquet是apache的一款列式存储数据文件。spark会自动解析它的格式(有哪些字段),并把每一列都作为可空的。主要还是在hadoop相关的环境下使用。

上面生成的parquet文件时可以直接读取的。和读取json文件一样,spark提供了parquet()方法:

Spark3 学习【基于Java】4. Spark-Sql数据源

除了save方法,spark也支持通过parquet方法直接保存:

Spark3 学习【基于Java】4. Spark-Sql数据源

Spark3 学习【基于Java】4. Spark-Sql数据源

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();

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

Spark3 学习【基于Java】4. Spark-Sql数据源

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

Spark3 学习【基于Java】4. Spark-Sql数据源

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

Spark3 学习【基于Java】4. Spark-Sql数据源

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

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

Spark3 学习【基于Java】4. Spark-Sql数据源

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

Spark3 学习【基于Java】4. Spark-Sql数据源

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

Spark3 学习【基于Java】4. Spark-Sql数据源

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

Spark3 学习【基于Java】4. Spark-Sql数据源

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

Spark3 学习【基于Java】4. Spark-Sql数据源

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

Spark3 学习【基于Java】4. Spark-Sql数据源

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5630.html

(0)
上一篇 2023-05-01
下一篇 2023-05-01

相关推荐

  • 以Python为中心的条件

    以Python为中心的条件Python是一种高级编程语言,它拥有强大的功能和简单易用的语法,正因如此Python成为了许多数据科学家和软件开发人员的首选语言。在今天的信息时代,越来越多的企业开始意识到Python为公司发展带来的影响力,然而,成功追踪趋势和发展Python的应用显然并不是件容易的事情。在这篇文章中,我们将从多个方面对以Python为中心的条件进行详细阐述,并以此探讨Python的优缺点和适用场景。

    2024-04-22
    73
  • oracle编译函数卡死问题

    oracle编译函数卡死问题SELECT * FROM V$DB_OBJECT_CACHE WHERE name=upper('Fn_JS_DBlink_BM') AND LOCKS!='0';s

    2023-03-13
    249
  • Python代码实现行分割

    Python代码实现行分割行分割是指将一行文本按照特定字符进行分割的操作,通常用于文本数据的处理。而Python是一门出色的文本处理语言,可以轻易实现行分割的操作。Python为行分割提供了多种实现方式,并且不同方式有不同的适用场景。

    2023-12-11
    109
  • Oracle函数「终于解决」

    Oracle函数「终于解决」1.Lag向上取一条,Lead向下取一条 Lag(Field01) over(order by Field02) 2.Rollup函数即内卷函数 分组统计 3. decode(条件,值1,返回值1,…

    2023-03-29
    168
  • docker compose实战_Docker

    docker compose实战_Docker一、 概述 compose 是用来定义和运行一个或多个容器(通常都是多个)运行和应用的工具。使用 compose 可以简化容器镜像的构建以及容器的运行。 compose 使用 YAML 文件来定义多容

    2023-05-20
    135
  • MySQL8.0关系数据库基础教程(三)-select语句详解[通俗易懂]

    MySQL8.0关系数据库基础教程(三)-select语句详解[通俗易懂]1 查询指定字段 在 employee 表找出所有员工的姓名、性别和电子邮箱。 SELECT 表示查询,随后列出需要返回的字段,字段间逗号分隔 FROM 表示要从哪个表中进行查询 分号为语句结束符 这

    2023-01-29
    156
  • Python实现访问数据库的API接口设计

    Python实现访问数据库的API接口设计SQLAlchemy是一个Python SQL工具和对象关系映射器(ORM),可以方便地实现访问数据库的API接口,适用于多种关系型数据库。它提供了一种简单的方式来定义数据模型,并将其映射到数据库模式。相比于直接使用SQL语句,SQLAlchemy可以轻松地修改数据库模型而不用修改SQL语句。此外,SQLAlchemy还提供了一些高级功能,例如连接池、事务、数据库迁移等,使得访问数据库变得更加方便和可靠。

    2023-12-05
    117
  • 如何在Jupyter Notebook中打开ipynb文件?

    如何在Jupyter Notebook中打开ipynb文件?在日常的Python开发工作中,我们经常需要编写Jupyter Notebook文档来进行数据分析、机器学习等任务。在这个过程中,我们会使用到很多不同的Notebook文件,这些文件的后缀名通常为.ipynb。本篇文章将从多个方面,介绍如何在Jupyter Notebook中打开.ipynb文件。

    2024-08-24
    28

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注