Spark 操作 Hive

Apache Hive 是 Hadoop 上的 SQL 引擎,Spark SQL 编译时可以包含 Hive 支持,也可以不包含。包含 Hive 支持的 Spark SQL 可以支持 Hive 表访问、UDF (用户自定义函数) 以及 Hive 查询语言(HiveQL/HQL)等。需要强调的一点是,如果要在 Spark SQL 中包含Hive 的库,并不需要事先安装 Hive。一般来说,最好还是在编译 Spark SQL 时引入 Hive支持,这样就可以使用这些特性了。如果你下载的是二进制版本的 Spark,它应该已经在编译时添加了 Hive 支持。
若要把 Spark SQL 连接到一个部署好的 Hive 上,你必须把 hive-site.xml 复制到Spark 的配置文件目录中($SPARK_HOME/conf)。即使没有部署好 Hive,Spark SQL 也可以运行。 需要注意的是,如果你没有部署好 Hive,Spark SQL 会在当前的工作目录中创建出自己的 Hive 元数据仓库,叫作 metastore_db。此外,如果你尝试使用 HiveQL 中的CREATE TABLE (并非 CREATE EXTERNAL TABLE)语句来创建表,这些表会被放在你默认的文件系统中的 /user/hive/warehouse 目录中(如果你的 classpath 中有配好的hdfs-site.xml,默认的文件系统就是 HDFS,否则就是本地文件系统)。spark-shell 默认是 Hive 支持的;代码中是默认不支持的,需要手动指定(加一个参数即可)。

内置Hive

如果使用 Spark 内嵌的 Hive, 则什么都不用做, 直接使用即可。
Hive 的元数据存储在 derby 中, 默认仓库地址:$SPARK_HOME/spark-warehouse

查看表

scala> spark.sql("show tables").show

在这里插入图片描述
创建表

scala> spark.sql("create table huan(id int)")

在这里插入图片描述
向表加载本地数据

scala> spark.sql("load data local inpath 'data/huan.txt' into table huan")

在这里插入图片描述在实际使用中, 几乎没有任何人会使用内置的 Hive

外部的 Hive

如果想连接外部已经部署好的 Hive,需要通过以下几个步骤:
➢ Spark 要接管 Hive 需要把 hive-site.xml 拷贝到 conf/目录下
➢ 把 Mysql 的驱动 copy 到 jars/目录下
➢ 如果访问不到 hdfs,则需要把 core-site.xml 和 hdfs-site.xml 拷贝到 conf/目录下
➢ 重启 spark-shell

scala> spark.sql("show tables").show

在这里插入图片描述
加载数据

scala> spark.sql("load data local inpath 'data/huan.txt' into table huanhuan")

查看数据

scala>spark.sql("select * from huanhuan").show

在这里插入图片描述
在Hive中查看数据
在这里插入图片描述几乎做到了数据同步!!!

代码操作 Hive

1)导入依赖

<dependency>
 <groupId>org.apache.spark</groupId>
 <artifactId>spark-hive_2.12</artifactId>
 <version>3.0.0</version>
</dependency>
<dependency>
 <groupId>org.apache.hive</groupId>
 <artifactId>hive-exec</artifactId>
 <version>1.2.1</version>
</dependency>
<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.1.27</version>
</dependency>

如上依赖,如果将Hive的版本设置Linux中的Hive(3.1.2)的版本,可能会报错,所以改回了老版本的Hive(1.2.1)

declared in MetaData, but this field doesnt exist in the class!

代码如下

package com.sql

import org.apache.log4j.{
    
    Level, Logger}
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession

object Spark_Hive {
    
    
  def main(args: Array[String]): Unit = {
    
    
    Logger.getLogger("org").setLevel(Level.ERROR)

    val conf = new SparkConf().setMaster("local[*]").setAppName("Spark_Hive")
    val spark = SparkSession.builder()
      .enableHiveSupport()
      .appName("sql")
      .config(conf)
      .getOrCreate()

    //使用SparkSQL连接内置Hive
    //1.拷贝hive-site.xml文件夹到classPath下
    //2.启用Hive支持
    //3.添加对应依赖关系,(MySQL的驱动)

    spark.sql("show tables").show
    

    //停止Spark
    spark.stop()
  }
}

注意:在开发工具中创建数据库默认是在本地仓库,通过参数修改数据库仓库的地址:

config("spark.sql.warehouse.dir", "hdfs://hadoop102:8020/user/hive/warehouse")

如果在执行操作时,出现如下错误:
在这里插入图片描述
可以代码最前面增加如下代码解决:

System.setProperty("HADOOP_USER_NAME", "root")

此处的 root 改为你们自己的 hadoop 用户名称

运行 Spark SQL CLI

Spark SQL CLI 可以很方便的在本地运行 Hive 元数据服务以及从命令行执行查询任务。在Spark 目录下执行如下命令启动 Spark SQL CLI,直接执行 SQL 语句,类似一 Hive 窗口

bin/spark-sql

效果图:
在这里插入图片描述

运行 Spark beeline

Spark Thrift Server 是 Spark 社区基于 HiveServer2 实现的一个 Thrift 服务。旨在无缝兼容HiveServer2。因为 Spark Thrift Server 的接口和协议都和 HiveServer2 完全一致,因此我们部署好 Spark Thrift Server 后,可以直接使用 hive 的 beeline 访问 Spark Thrift Server 执行相关语句。Spark Thrift Server 的目的也只是取代 HiveServer2,因此它依旧可以和 Hive Metastore进行交互,获取到 hive 的元数据。
如果想连接 Thrift Server,需要通过以下几个步骤:
➢ Spark 要接管 Hive 需要把 hive-site.xml 拷贝到 conf/目录下
➢ 把 Mysql 的驱动 copy 到 jars/目录下
➢ 如果访问不到 hdfs,则需要把 core-site.xml 和 hdfs-site.xml 拷贝到 conf/目录下
➢ 启动 Thrift Server

[root@hadoop102 spark-local]# sbin/start-thriftserver.sh

➢ 使用 beeline 连接 Thrift Server

[root@hadoop102 spark-local]# bin/beeline -u jdbc:hive2://hadoop102:10000 -n root

效果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45417821/article/details/121344185