SparkSQL-SparkOnHive

部署

连接Hive操作 

小试牛刀:Hive版本的WordCount 

从MySQL中读取数据存储到hive中 


部署

 1、Spark 要接管 Hive 需要把 hive-site.xml 拷贝到 conf/目录下

2、把 Mysql 的驱动 copy 到 jars/目录下

3、 如果访问不到 hdfs,则需要把 core-site.xml 和 hdfs-site.xml 拷贝到 conf/目录下

     导入依赖

<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-site.xml 文件拷贝到项目的 resources 目录中

        虚拟机中后台启动hive 

hiveserver2 &
nohup hive --service metastore &

连接Hive操作 

在操作hive时,需要对哪个库的表进行操作则需要写 -> 数据库名.表名 不然都会默认使用default数据库 
spark.sql("select * from ee.user")
def main(args: Array[String]): Unit = {
    //创建Session对象
    val spark = SparkSession
      .builder() //构建器
      .appName("sparkSQL") //序名称程
      .master("local[*]") //执行方式:本地
      .enableHiveSupport() //支持hive相关操作
      .getOrCreate() //创建对象

   spark.sql("select * from ee.user")

   spark.close()
  }

小试牛刀:Hive版本的WordCount 

注意: 当开启了enableHiveSupport()机制之后可能会导致在本地磁盘的文件会有突然读取不到的清空。原因是hive默认会从HDFS上面获取数据文件

想访问本地磁盘时的解决方法:需在本地磁盘路径前添加file:///

spark.read.text("file:///datas\\a.txt")
def main(args: Array[String]): Unit = {
    //创建Session对象
    val spark = SparkSession
      .builder() //构建器
      .appName("sparkSQL") //序名称程
      .master("local[*]") //执行方式:本地
      .enableHiveSupport() //支持hive相关操作
      .getOrCreate() //创建对象

    val df: DataFrame = spark.read.text("file:///D:\\spark.test\\datas\\a.txt") //载入数据
    df.createTempView("wc") //创建表
    spark.sql(
      """
        |select tmp.word,count(tmp.word) from(
        |select explode(split(value," ")) word from wc
        |)tmp
        |group by tmp.word
        |order by count desc
        |""".stripMargin).show()

    spark.close()
  }

从MySQL中读取数据存储到hive中 

        准备MySQL数据库user表 

        向Hive创建表时 操作hive权限问题 因为是创建到HDFS上所以要提供root用户权限

System.setProperty("HADOOP_USER_NAME","root")
def main(args: Array[String]): Unit = {
    //添加操作HDFS的用户名
    System.setProperty("HADOOP_USER_NAME","root")
    System.setProperty("user.name","root")
    //创建Session对象
    val spark = SparkSession
      .builder() //构建器
      .appName("sparkSQL") //序名称程
      .master("local[*]") //执行方式:本地
      .enableHiveSupport() //支持hive相关操作
      .getOrCreate() //创建对象

    //从MySQL中读取数据存储到hive中 
      //创建info表
    spark.sql( //需指定数据库不然会创建到默认数据库下
      """
        |create table default.idd(
        |id int,
        |name string,
        |age int
        |)
        |""".stripMargin)

    //jdbc读取mysql
    val pro = new Properties()
    pro.put("user","root") //指定用户名
    pro.put("password","p@ssw0rd") //指定密码
    //jdbc("路径","表名","Properties对象")
    val df = spark.read.jdbc("jdbc:mysql://master:3306/spark-sql","user",pro)

    df.write.insertInto("default.idd")
    spark.sql("select * from default.idd").show()
    spark.close()
  }

ERROR KeyProviderCache: Could not find uri with key [dfs.encryption.key.provider.uri] to create a keyProvider !!

这个报错是HDFS客户端的一个bug,但并不影响作业正常运行,且在2.8版本之后已经修复

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

open_test01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值