当前位置: > > > Spark - 使用SparkSQL集成Hive教程(命令行中集成、代码中集成)

Spark - 使用SparkSQL集成Hive教程(命令行中集成、代码中集成)

一、基本介绍

(1)SparkSQL 集成 Hive,就是在 SparkSQL 中直接操作 Hive 的表。通过这种方式,可以利用 Spark 的计算引擎提高计算效率,并且不需要每次使用时临时在 SparkSQL 中创建表,从而省略了创建表的复杂过程。
注意:在 SparkSQL 中操作 Hive 表,底层走的就不是 MapReduce 计算引擎了,而是 Spark 引擎。SparkSQL 会读取 Hive 中的元数据,以及存储在 HDFS 上的数据,最终通过 Spark 引擎进行计算。

(2)SparkSQL 集成 Hive 常见的有两种用法:
  • 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 成功:
评论0