Spark大数据处理讲课笔记4.6 Spark SQL数据源 - JDBC

news/2024/4/28 8:21:19/文章来源:https://blog.csdn.net/howard2005/article/details/130680352

文章目录

  • 零、本讲学习目标
  • 一、Spark SQL读取关系数据库
  • 二、Spark SQL JDBC连接属性
  • 三、创建数据库与表
    • (一)创建数据库
    • (二)创建学生表
    • (二)创建成绩表
  • 四、读取和写入数据库表
    • (一)利用`dbtable`属性读取数据表
    • (二)利用`dbtable`属性读取数据表查询
    • (三)将数据帧内容写入数据表
    • (四)利用`query`属性读取数据表查询

零、本讲学习目标

  1. 了解Spark SQL JDBC连接属性
  2. 掌握利用Spark SQL读取关系数据库

一、Spark SQL读取关系数据库

  • Spark SQL还可以使用JDBC API从其他关系型数据库读取数据,返回的结果仍然是一个DataFrame,可以很容易地在Spark SQL中处理,或者与其他数据源进行连接查询。

二、Spark SQL JDBC连接属性

  • 在使用JDBC连接数据库时可以指定相应的连接属性
属性介绍
url连接的JDBC URL
driverJDBC驱动的类名
user数据库用户名
password数据库密码
dbtable数据库表名或能代表一张数据库表的子查询。在读取数据时,若只使用数据库表名,则将查询整张表的数据;若希望查询部分数据或多表关联查询,则可以使用SQL查询的FROM子句中有效的任何内容,例如放入括号中的子查询。该属性的值会被当作一张表进行查询,查询格式:select * from <dbtable属性值> where 1 = 1。注意,不允许同时指定dbtable和query属性。
query指定查询的SQL语句。注意:不允许同时指定dbtable和query属性,也不允许同时指定query和partitionColumn属性。当需要指定partitionColumn属性时,可以使用dbtable属性指定子查询,并使用子查询的别名对分区列进行限定。
partitionColumn
lowerBound
upperBound
这几个属性,若有一个被指定,则必须全部指定,且必须指定numPartitions属性。它们描述了如何在从多个Worker中并行读取数据时对表进行分区。partitionColumn必须是表中的数字、日期或时间戳列。注意,lowerBound 和upperBound只是用来决定分区跨度的,而不是用来过滤表中的行。因此,表中的所有行都将被分区并返回。
numPartitions对表并行读写数据时的最大分区数,这也决定了并发JDBC连接的最大数量。如果要写入数据的分区数量超过了此限制的值,那么在写入之前可以调用coalesce(numpartition)将分区数量减少到此限制的值。

三、创建数据库与表

(一)创建数据库

  • 创建数据库spark_db
    在这里插入图片描述
    在这里插入图片描述

(二)创建学生表

  • 创建表student,执行命令:CREATE TABLE student (id INT, name VARCHAR(10), gender VARCHAR(2), age INT);
    在这里插入图片描述
  • student表插入几条记录
    在这里插入图片描述
INSERT INTO student VALUES (1, '李文君', '女', 18);
INSERT INTO student VALUES (2, '唐玉龙', '男', 19);
INSERT INTO student VALUES (3, '陈燕文', '女', 20);
INSERT INTO student VALUES (4, '洪小刚', '男', 18);
INSERT INTO student VALUES (5, '郑小翠', '女', 19);

(二)创建成绩表

  • 创建表student,执行命令:CREATE TABLE score (id INT, name VARCHAR(10), score REAL);
    在这里插入图片描述
  • score表插入几条记录
    在这里插入图片描述

四、读取和写入数据库表

  • 启动Spark Shell
    在这里插入图片描述

(一)利用dbtable属性读取数据表

  • 读取student
val studentDF = spark.read.format("jdbc").option("url", "jdbc:mysql://master:3306/spark_db?useSSL=false")     .option("driver","com.mysql.jdbc.Driver")  .option("dbtable", "student")  .option("user", "root")  .option("password", "903213")  .load()
  • 执行上述命令
    在这里插入图片描述
  • 执行命令:studentDF.show()
    在这里插入图片描述

(二)利用dbtable属性读取数据表查询

  • 读取studentscore关联查询结果
val resultDF = spark.read.format("jdbc").option("url", "jdbc:mysql://master:3306/spark_db?useSSL=false")     .option("driver","com.mysql.jdbc.Driver")  .option("dbtable", "(select st.id, st.name, gender, age, score from student st inner join score sc on st.id = sc.id) t")  .option("user", "root")  .option("password", "903213")  .load()
  • 执行上述命令(dbtable属性的值是一个子查询,相当于SQL查询中的FROM关键字后的一部分)
    在这里插入图片描述
  • 查看结果数据帧内容,执行命令:resultDF.show()
    在这里插入图片描述
  • 将数据帧内容以json格式写入HDFS的/out目录
    在这里插入图片描述
  • 在slave1虚拟机上查看生成的json文件
    在这里插入图片描述

(三)将数据帧内容写入数据表

  • 将数据帧内容以jdbc格式写入数据库spark_dbtest
resultDF.write.mode(SaveMode.Overwrite).format("jdbc").option("url", "jdbc:mysql://master:3306/spark_db?useSSL=false")     .option("dbtable", "test").option("user", "root").option("password", "903213").save()
  • 执行上述命令
    在这里插入图片描述
  • 在Navicat里查看生成的test
    在这里插入图片描述

(四)利用query属性读取数据表查询

  • 读取studentscore关联查询结果
val resultDF = spark.read.format("jdbc").option("url", "jdbc:mysql://master:3306/spark_db?useSSL=false")     .option("driver","com.mysql.jdbc.Driver")  .option("query", "select st.name, st.gender, sc.score from student st inner join score sc on st.id = sc.id")  .option("user", "root")  .option("password", "903213")  .load()
  • 执行上述命令,报错
    在这里插入图片描述

  • Spark2.1.1的Spark SQL的JDBC属性里没有query
    在这里插入图片描述

  • 从Spark 2.4.0开始的Spark SQL的JDBC属性里有query
    在这里插入图片描述

  • 将Spark集群的Spark版本升级到Spark2.4.4

  • 启动Spark Shell,执行命令:spark-shell --master spark://master:7077
    在这里插入图片描述

  • 读取studentscore关联查询结果

val resultDF = spark.read.format("jdbc").option("url", "jdbc:mysql://master:3306/spark_db?useSSL=false")     .option("driver","com.mysql.jdbc.Driver")  .option("query", "select st.name, st.gender, sc.score from student st inner join score sc on st.id = sc.id")  .option("user", "root")  .option("password", "903213")  .load()
  • 执行上述命令
    在这里插入图片描述
  • 执行命令:resultDF.show()
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xcode真机运行报错:Failed to prepare the device for development解决方法

一、遇到的问题 运行Xcode然后打包APP&#xff0c;结果Xcode报错&#xff0c;如下&#xff1a; Failed to prepare the device for development. This operation can fail if the version of the OS on the device is incompatible with the installed version of Xcode. You …

macOS Ventura 13.4 (22F66) 正式版发布,ISO、IPSW、PKG 下载

本站下载的 macOS Ventura 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和 Linux 中创建可引导介质。 请访问原文链接&#xff1a…

chatgpt赋能Python-python3_8_5安装后怎么打开

Python3.8.5安装后怎么打开&#xff1a;简易步骤指南 Python是一种高级编程语言&#xff0c;被广泛用于数据分析、机器学习、自动化、网络编程等多个方面。Python语言优雅简洁&#xff0c;易于上手&#xff0c;是编程初学者的最佳入门语言之一。本文将介绍Python3.8.5版本的安…

管道通信,共享内存

什么是有名管道 有名管道&#xff08;Named Pipe&#xff09;是一种特殊的文件类型&#xff0c;也称为 FIFO。它提供了一种进程间通信的机制&#xff0c;允许不相关的进程通过读写共享的文件来交换数据。 与普通文件不同的是&#xff0c;有名管道在文件系统中存在一个路径名&…

redis单机版本Java代码实践

pom依赖 引入redis的starter以及commons-pool2的依赖&#xff0c;commons-pool2是配置连接池需要使用的&#xff0c;不引入&#xff0c;只有连接池配置是不会创建连接池的 <!-- redis --><dependency><groupId>org.springframework.boot</groupId><…

基于协同过滤的推荐算法

基于协同过滤的推荐算法 基于协同过滤&#xff08;CF&#xff09;的推荐基于近邻的协同过滤基于用户的协同过滤&#xff08;User-CF&#xff09;基于物品的协同过滤&#xff08;Item-CF&#xff09;User-CF 和 Item-CF 的比较基于协同过滤的推荐优缺点基于模型的协同过滤隐语义…

python类的高级函数

类的高级函数 __str__ 如果定义了该函数&#xff0c;当print当前实例化对象的时候&#xff0c;会返回该函数的return信息 用法&#xff1a; def __str__(self): return str_type 参数&#xff1a;无 返回值&#xff1a;一般返回对于该类的描述信息 __getattr__ 当调用的…

JavaWeb-RequestResponse的使用

Request&Response 今日目标 掌握Request对象的概念与使用掌握Response对象的概念与使用能够完成用户登录注册案例的实现能够完成SqlSessionFactory工具类的抽取 1&#xff0c;Request和Response的概述 Request是请求对象&#xff0c;Response是响应对象。这两个对象在我们…

深入理解Java虚拟机:JVM高级特性与最佳实践-总结-7

深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践-总结-7 类文件结构概述无关性的基石 虚拟机类加载机制概述类加载的时机 类文件结构 代码编译的结果从本地机器码转变为字节码&#xff0c;是存储格式发展的一小步&#xff0c;却是编程语言发展的一大步 概述 我们写的程…

在阿里做了6年软件测试,4月无情被辞,想给划水的兄弟提个醒

先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入阿里&#xff0c;以“人员优化”的名义无情被裁员&#xff0c;之后跳槽到了有赞&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是6年的工作经验吧。 这6年之间完成了一次…

060:cesium设置网格Grid材质

第060个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置网格材质,请参考源代码,了解GridMaterialProperty的应用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共93行)相关API参考:专栏目标示例效…

chatgpt赋能Python-python3_9_6怎么用

Python 3.9.6简介 Python 3.9.6是2021年6月28日发布的Python编程语言的最新版本&#xff0c;它提供了一些有用的新功能和改进&#xff0c;包括优化的解释器性能和可变构造体。它是一种功能强大的编程语言&#xff0c;既易于学习又易于使用&#xff0c;非常适用于开发Web应用程…

SaaS 产品如何选择设计协作工具?

文章内容转载腾讯 CoDesign 随着互联网及其衍生技术的发展&#xff0c;企业比以往更依赖内容去吸引、去培养自己的用户&#xff0c;寻求转化。小鹅通就是在微信生态中帮助企业通过知识服务去实现内容分发和流量聚合&#xff0c;帮助企业沉淀用户&#xff0c;提供深度私域运营服…

自定义颜色编辑选取对话框

一、简介 Qt中已经有一些封装好的对话框&#xff0c;比如QMessageBox、QColorDialog等&#xff0c;使用起来快捷方便&#xff0c;但缺点是我们无法为它们自定义样式&#xff0c;所以可能难以“融入”我们的项目。既然如此&#xff0c;那就自己做一个把。抱着这样的想法&#x…

如何成功申请计算机软件著作权【申请流程完整记录】

致谢 &#xff1a;此博文的编写包括软著的申请&#xff0c;均借鉴了大佬【万里守约】的博客 — 提示&#xff1a;此博文仅适合个人申请&#xff0c;因为我是自己一个人的项目&#xff0c;自己一个人申请软著 文章目录 前言&#xff1a;一、网站注册与实名认证二、材料准备软著申…

ChatGPT工作提效之初探路径独孤九剑遇强则强

ChatGPT工作提效之遇强则强 前言一、如何使用ChatGPT二、ChatGPT实战应用三、ChatGPT会叫的小孩有奶吃工具类的交互问答类的交互开发类的交互 前言 读《笑傲江湖》西湖比剑时&#xff0c;对于独孤九剑1的解读印象颇为深刻。令狐冲被任我行这个高手激发出许多精妙的剑招。这独孤…

nvm-windows安装和配置

1.下载nvm-windows https://github.com/coreybutler/nvm-windows/releases 进入后如下图 选择nvm-setup.exe下载 2.安装 2.1 运行安装包&#xff0c;同意协议&#xff0c;下一步 2.2 选择nvm的安装目录&#xff0c;安装路径名最好不要有空格 2.3 点击Next&#xff0c;设…

linux 串口改为固定

在/etc/udev/rules.d 目录下新建定义规则的文件 1. 文件名要按规范写否则改动无效2. 规则文件必须以.rules 结尾3. 规则文件名称必须遵循 xx-name.rules 格式&#xff08;xx 为数字或字母&#xff0c;name 为规则名称&#xff09;&#xff0c;例如 99-serial-ports.rules。4. 规…

chatgpt赋能Python-python3_8_5怎么保存

Python 3.8.5&#xff1a;什么是它&#xff0c;为什么它重要&#xff0c;以及如何安装和保存&#xff1f; Python是当今世界上最受欢迎的编程语言之一。Python 3.8.5是该语言的最新版本&#xff0c;它引入了一些重要的改进和新特性。这篇文章将介绍Python 3.8.5并向您展示如何…

windows搭建pyspark环境详细教程

一.安装jdk及配置环境变量: 下载地址&#xff1a; https://www.oracle.com/java/technologies/downloads/#java8-windows 安装步骤&#xff1a; 下载后点击安装&#xff0c;中途可以自定义安装路径&#xff0c;最后查看安装路径&#xff1a; 开始配置系统环境变量&#xff1a…