Spark - 使用SparkSQL集成Hive教程(命令行中集成、代码中集成)
一、基本介绍
(1)SparkSQL 集成 Hive,就是在 SparkSQL 中直接操作 Hive 的表。通过这种方式,可以利用 Spark 的计算引擎提高计算效率,并且不需要每次使用时临时在 SparkSQL 中创建表,从而省略了创建表的复杂过程。
注意:在 SparkSQL 中操作 Hive 表,底层走的就不是 MapReduce 计算引擎了,而是 Spark 引擎。SparkSQL 会读取 Hive 中的元数据,以及存储在 HDFS 上的数据,最终通过 Spark 引擎进行计算。
- 在 SparkSQL 命令行中集成 Hive:这种方式便于在 SparkSQL 命令行中进行调试,主要在调试阶段会使用。
- 在 SparkSQL 代码中集成 Hive:这种方式是在代码中通过 SparkSQL 直接操作 Hive 中的表,针对例行化的定时任务一般都是使用这种方式。
二、在 SparkSQL 命令行中集成Hive
1,安装配置
(1)将 hive 的 conf 目录下的 hive-site.xml 文件复制到 spark 的 conf 目录下:
cp /usr/local/hive/conf/hive-site.xml /usr/local/spark-3.4.1-bin-hadoop3/conf/
(2)将 mysql 的驱动 jar 包拷贝到 spark 的 jar 目录中:
cp /usr/local/hive/lib/mysql-connector-j-8.2.0.jar /usr/local/spark-3.4.1-bin-hadoop3/jars/
2,使用测试
(1)首先执行如下命令启动 Spark SQL shell,并配置指定 Spark 应用程序在 YARN 上运行
./bin/spark-sql --master yarn
(2)然后执行如下命令创建一张 s1 表:
create table s1(name string,age int);
(3)接着查看库中的所有表,可以发现里面有我们刚刚创建的 s1 表:
show tables;
(4)然后执行如下命令往表中插入一条数据:
insert into s1(name,age) values('hangge',66);
(5)接着我们查询该表的数据:
select * from s1;
(6)前面 sparksql 使用的就是 hive 的元数据了,所以在 sparksql 中创建的表会存储到 hive 中,在 hive 中也可以使用。我们先查看一下 hive 中的元数据,是可以看到刚才创建的表信息的。
(7)然后在 hive 命令行中确认一下是否可以操作:
show tables; select * from s1;
(8)我们还可以在 hive 命令行中确认一下这个表的表结构信息,以及数据存储的位置。可以发现通过 SparkSQL 创建的表和 Hive 创建的表没有什么区别。
- 在 LOCATION 中可以看到这个表的存储目录是在 hive 的默认存储目录中。
- 在 TBLPROPERTIES 可以看到 spark.sql.create.version,表示这个表是通过 sparksql 创建的。
show create table s1;
三、在 SparkSQL 代码中集成 Hive
1,安装配置
(1)想要通过 SparkSQL 代码操作 Hive,首先需要在 pom.xml 文件中引入额外引入 spark-hive 相关的依赖:
<dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.12</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-hive_2.12</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency> </dependencies>
(2)接着将 hive 的 conf 目录下的 hive-site.xml 文件复制到项目的 resouces 目录中:
注意:如果集群中用到了 HDFS 的 HA 架构,还需要引入 HDFS 相关的配置文件。
2,使用测试
(1)我们编写一测试类来读取 hive 中的 s1 表,并将结果数据打印出来:
import org.apache.spark.SparkConf import org.apache.spark.sql.SparkSession object SparkSQLReadHive{ def main(args: Array[String]): Unit = { val conf = new SparkConf() .setMaster("local") //获取SparkSession,为了操作SparkSQL val sparkSession = SparkSession .builder() .appName("SparkSQLReadHive") .config(conf) //开启对Hive的支持,支持连接Hive的MetaStore、Hive的序列化、Hive的自定义函数 .enableHiveSupport() .getOrCreate() //执行sql查询 sparkSession.sql("select * from s1").show() sparkSession.stop() } }
(2)代码执行以后可以看到控制台输出如下内容,说明 SparkSQL 代码集成 Hive 成功: