SparkSQL与Hive交互
SparkSQL可以采用内嵌Hive,也可以采用外部Hive。企业开发中,通常采用外部Hive。
一、内嵌Hive应用
内嵌Hive,元数据存储在Derby数据库。
(1)如果使用Spark内嵌的Hive,则什么都不用做,直接使用即可。
[root@bigdata111 spark-local]$ bin/spark-shell
scala> spark.sql("show tables").show
注意:执行完后,发现多了$SPARK_HOME/metastore_db
和derby.log
,用于存储元数据
(2)创建一个表
scala> spark.sql("create table user(id int, name string)")
注意:执行完后,发现多了$SPARK_HOME/spark-warehouse/user
,用于存储数据库数据
(3)查看数据库
scala> spark.sql("show tables").show
(4)向表中插入数据
scala> spark.sql("insert into user values(1,'wgh')")
(5)查询数据
scala> spark.sql("select * from user").show
注意:然而在实际使用中,几乎没有任何人会使用内置的Hive,因为元数据存储在derby数据库,不支持多客户端访问。
二、外部Hive应用
如果Spark要接管Hive外部已经部署好的Hive,需要通过以下几个步骤:
(0)为了说明内嵌Hive和外部Hive区别:删除内嵌Hive的metastore_db和spark-warehouse
[root@bigdata111 spark-local]$ rm -rf metastore_db/ spark-warehouse/
(1)确定原有Hive是正常工作的
[root@bigdata111 hadoop-3.1.3]$ sbin/start-dfs.sh
[root@bigdata111 hadoop-3.1.3]$ sbin/start-yarn.sh
[root@bigdata111 hive]$ bin/hive
(2)需要把hive-site.xml拷贝到spark的conf/目录下
[root@bigdata111 conf]$ cp hive-site.xml /opt/module/spark-local/conf/
(3)如果以前hive-site.xml文件中,配置过Tez相关信息,注释掉(不是必须
)
(4)把MySQL的驱动copy到Spark的jars/目录下
[root@bigdata111 software]$ cp mysql-connector-java-5.1.48.jar /opt/module/spark-local/jars/
(5)需要提前启动hive服务,/opt/module/hive/bin/hiveservices.sh start(不是必须
)
(6)如果访问不到HDFS,则需把core-site.xml和hdfs-site.xml拷贝到conf/目录(不是必须
)
(7)启动 spark-shell
[root@bigdata111 spark-local]$ bin/spark-shell
(8)查询表
scala> spark.sql("show tables").show
(9)创建一个表
scala> spark.sql("create table student(id int, name string)")
(10)向表中插入数据
scala> spark.sql("insert into student values(1,'wgh')")
(11)查询数据
scala> spark.sql("select * from student").show
三、运行Spark SQL CLI
Spark SQL CLI可以很方便的在本地运行Hive元数据服务以及从命令行执行查询任务。在Spark目录下执行如下命令启动Spark SQL CLI,直接执行SQL语句,类似Hive窗口。
[root@bigdata111 spark-local]$ bin/spark-sql
spark-sql (default)> show tables;
四、IDEA操作外部Hive
(1)在pom中添加依赖
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.12</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.27</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.12</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
(2)拷贝hive-site.xml
到resources目录(如果需要操作Hadoop,需要拷贝hdfs-site.xml、core-site.xml、yarn-site.xml)
(3)代码实现
package com.wghu.sparksql
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
/**
* User: WGH
* Date:2023-03-08
*
* idea写代码连接外部hive
* 1.导入pom依赖,spark-sql mysql连接驱动,spark-hive
* 2.将hive-site.xml放入到项目的类路径下
* 3.代码里面获取外部hive的支持,在创建sparkSession对象是加入.enableHiveSupport()
*/
object SparkSQL12_Hive {
def main(args: Array[String]): Unit = {
System.setProperty("HADOOP_USER_NAME","root")
//1.创建配置对象
val conf : SparkConf = new SparkConf()
.setAppName("SparkSQLTest")
.setMaster("local[*]")
//2.创建sparkSession对象
val spark: SparkSession = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate()
//3.编写代码
//连接hive
spark.sql("show tables").show()
spark.sql("create table bbb(id int,name string)").show()
spark.sql("insert into bbb values(1,'wgh')").show()
spark.sql("select * from bbb").show()
//4.关闭sc
spark.stop()
}
}