Spark---Spark连接Hive

文章详细介绍了如何配置Spark以连接到Hive,包括将hive-site.xml复制到Spark的配置目录,启动Hadoop和Hive服务,以及在Spark代码中添加必要的依赖。之后,文章展示了使用SparkSQL通过Hivemetastore访问和操作Hive表,包括显示数据库,读取表,进行数据统计并保存结果回Hive的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spark连接Hive



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下面的hive-site.xml拷贝到spark的conf目录下
并且添加配置,如果有请忽略

hive-site.xml

  <property>
     <name>hive.metastore.uris</name>
     <value>thrift://192.168.95.150:9083</value>
  </property>

在这里插入图片描述
将hive下面的jar包拷贝到spark的conf目录下

cp /opt/soft/hive312/lib/mysql-connector-java-8.0.29.jar ./
cp /opt/soft/hive312/lib/hive-beeline-3.1.2.jar ./
cp /opt/soft/hive312/lib/hive-cli-3.1.2.jar ./
cp /opt/soft/hive312/lib/hive-exec-3.1.2.jar ./
cp /opt/soft/hive312/lib/hive-jdbc-3.1.2.jar ./
cp /opt/soft/hive312/lib/hive-metastore-3.1.2.jar ./

启动hadoop

start-all.sh

启动hive

nohup hive --service metastore &
nohup hive --service hiveserver2 &

spark连接hive

添加依赖

 <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-sql_2.12</artifactId>
      <version>3.1.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-hive_2.12</artifactId>
      <version>3.1.2</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.29</version>
    </dependency>

代码

def main(args: Array[String]): Unit = {
    //环境配置
    val spark: SparkSession = SparkSession.builder().appName("sparkhive")
      .master("local[*]")
      .config("hive.metastore.uris", "thrift://192.168.95.150:9083")
      .enableHiveSupport()
      .getOrCreate()
    spark.sql("show databases").show()

    println("----------------------")
    val ecd: DataFrame = spark.table("shopping.ext_customer_details")
    //ecd.printSchema()
    ecd.show()
    import spark.implicits._
    import org.apache.spark.sql.functions._
    //统计每个国家有多少人
    val ecd2: Dataset[Row] = ecd.filter($"customer_id" =!= "customer_id")
    val usernumDF: DataFrame = ecd2.groupBy("country").agg(count("customer_id").as("num"))
    usernumDF.show()

    //保存到hive中名字为username,以追加方式
    usernumDF.write.mode(SaveMode.Append).saveAsTable("shopping.usernum")
    spark.close()
  }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值