Spark SQL综合实战(一)(史上最详细)
序言:
关系数据库已经很流行 关系数据库在大数据时代已经不能满足要求 首先,用户需要从不同数据源执行各种操作,包括结构化和非结构化数据 其次,用户需要执行高级分析,比如机器学习和图像处理 在实际大数据应用中,经常需要融合关系查询和复杂分析算法(比如机器学习或图像处理),但是,缺少这样的系统。
Spark SQL填补了这个鸿沟:
首先,可以提供DataFrame API,可以对内部和外部各种数据源执行各种关系操作 其次,可以支持大量的数据源和数据分析算法 Spark SQL可以融合:传统关系数据库的结构化数据管理能力和机器学习算法的数据处理能力
DataFrame的推出,让Spark具备了处理大规模结构化数据的能力,不仅比原有的RDD转化方式更加简单易用,而且获得了更高的计算性能 Spark能够轻松实现从MySQL到DataFrame的转化,并且支持SQL查询.
RDD是分布式的 Java对象的集合,但是,对象内部结构对于RDD而言却是不可知的 DataFrame是一种以RDD为基础的分布式数据集,提供了详细的结构信息。
DataFrame的创建
在创建DataFrame之前,为了支持RDD转换为DataFrame及后续的SQL操作,需要通过import语句(即import spark.implicits._)导入相应的包,启用隐式转换。
在创建DataFrame时,可以使用spark.read操作,从不同类型的文件中加载数据创建DataFrame,
例如:
spark.read.json("people.json"):读取people.json文件创建DataFrame;在读取本地文件或HDFS文件时,要注意给出正确的文件路径;
spark.read.parquet("people.parquet"):读取people.parquet文件创建DataFrame;
spark.read.csv("people.csv"):读取people.csv文件创建DataFrame。
一个实例
在“/usr/local/spark/examples/src/main/resources/”这个目录下,这个目录下有两个样例数据people.json和people.txt。
people.json文件的内容如下:
{"name":"Michael"}
{"name":"Andy", "age":30}
{"name":"Justin", "age":19}
people.txt文件的内容如下:
Michael, 29
Andy, 30
Justin, 19
可以执行一些常用的DataFrame操作
6.6.1 利用反射机制推断RDD模式
现在要把people.txt加载到内存中生成一个DataFrame,并查询其中的数据
在利用反射机制推断RDD模式时,需要首先定义一个case class,因为,只有case class才能被Spark隐式地转换为DataFrame
6.6.2 使用编程方式定义RDD模式
当无法提前定义case class时,就需要采用编程方式定义RDD模式
比如,现在需要通过编程方式把people.txt加载进来生成DataFrame,并完成SQL查询。
Spark SQL可以支持Parquet、JSON、Hive等数据源,并且可以通过JDBC连接外部数据源
6.7.1 通过JDBC连接数据库
1. 准备工作
2. 读取MySQL数据库中的数据
3. 向MySQL数据库写入数据
在Linux中启动MySQL数据库
输入下面SQL语句完成数据库和表的创建:
执行以下命令连接数据库,读取数据,并显示:
3. 向MySQL数据库写入数据
现在开始在spark-shell中编写程序,往spark.student表中插入两条记录
可以看一下效果,看看MySQL数据库中的spark.student表发生了什么变化
6.7.2 连接Hive读写数据
1.准备工作
Hive与Hadoop生态系统中其他组件的关系
解压文件
在编译时,需要给出电脑上之前已经安装好的Hadoop的版本
hadoop version
运行编译命令,对Spark源码进行编译
编译成功后会得到文件名“spark-2.1.0-bin-h27hive.tgz”,这个就是包含Hive支持的Spark安装文件
启动进入了spark-shell,由于已经可以支持Hive,会显示如下信息:
假设已经完成了Hive的安装,并且使用的是MySQL数据库来存放Hive的元数据
需要借助于MySQL保存Hive的元数据,首先启动MySQL数据库:
启动Hadoop
Hadoop启动成功以后,可以再启动Hive
进入Hive,新建一个数据库sparktest,并在这个数据库下面创建一个表student,并录入两条数据
需要修改“/usr/local/sparkwithhive/conf/spark-env.sh”这个配置文件:
请在spark-shell(包含Hive支持)中执行以下命令从Hive中读取数据:
编写程序向Hive数据库的sparktest.student表中插入两条数据:
输入以下命令查看Hive数据库内容的变化:
可以看到,插入数据操作执行成功了!