SparkSQL和Hive的整合,是一种比较常见的关联处理方式,SparkSQL加载Hive中的数据进行业务处理,同时将计算结果落地回Hive中。

example

idea新建项目,并把hive-site.xml,core-site.xml,hdfs-site.xml文件下载到Resources文件夹下.

读取数据

object HiveDemo extends App{private val session: SparkSession = SparkSession.builder().enableHiveSupport().master("local").appName("hive").getOrCreate()//Returns the specified table/view as a DataFrame.//将hive的table转为df对象private val frame: DataFrame = session.table("sz.emp1")//查询每个部门的平均工资,最高工资,最低工资,总人数//创建临时视图frame.createTempView("a")val sql="""|select deptno,max(sal),min(sal),avg(nvl(sal,0))|from|a|group by deptno|""".stripMargin//使用Spark执行SQL查询,以数df形式返回结果.session.sql(sql).show()
}

结果如下

+------+--------+--------+--------------------+
|deptno|max(sal)|min(sal)|avg(nvl(a.`sal`, 0))|
+------+--------+--------+--------------------+
|    20|    3000|     800|              2175.0|
|    10|    5000|    1300|  2916.6666666666665|
|    30|    2850|     950|  1566.6666666666667|
+------+--------+--------+--------------------+

也可以如下查询
agg方法:通过指定列名和聚合方法计算聚合。结果DataFrame还将包含分组列。
可用的聚合方法有avg、max、min、sum、count

frame.groupBy("deptno").agg("sal"->"max","sal"->"min").show()

结果如下

+------+--------+--------+
|deptno|max(sal)|min(sal)|
+------+--------+--------+
|    20|    3000|     800|
|    10|    5000|    1300|
|    30|    2850|     950|
+------+--------+--------+

写入数据

saveAsTable方法
DataFrame的内容另存为指定的表。
在表已经存在的情况下,此函数的行为取决于由mode函数指定的保存模式(默认为引发异常)。当mode为Overwrite时,DataFrame的架构不需要与现有表的架构相同。
当mode为Append时,如果有一个现有表,我们将使用现有表的格式和选项。表中的数据顺序不必与该列的数据顺序相同。与InsertInto不同,saveAsTable将使用列名来查找正确的列位置。

object HiveDemo2 extends App {System.setProperty("HADOOP_USER_NAME", "root")private val session: SparkSession = SparkSession.builder().enableHiveSupport()//往动态分区表写数据需要这个.config("hive.exec.dynamic.partition.mode", "nonstrict").master("local").appName("hive").getOrCreate()//连接hive表返回df对象private val frame: DataFrame = session.table("sz.emp1")//存入数据,如果没有,会在hive中新建表格frame.write.saveAsTable("sz.temp1")session.stop()
}

例子

scala> Seq((1, 2)).toDF("i", "j").write.mode("overwrite").saveAsTable("t3")
//saveAsTable会基于列名来解析数据
scala> Seq((3, 4)).toDF("j", "i").write.mode("append").saveAsTable("t3")scala> sql("select * from t3").show
+---+---+
|  i|  j|
+---+---+
|  1|  2|
|  4|  3|
+---+---+

insertInto方法
将DataFrame的内容插入到指定的表中。它要求DataFrame的schema与表的schema相同。与saveAsTable不同,insertInto忽略列名,只使用基于位置的解析。

object HiveDemo3 extends App {System.setProperty("HADOOP_USER_NAME", "root")private val session: SparkSession = SparkSession.builder().enableHiveSupport().master("local").appName("hive").getOrCreate()//读取emp1表的数据转为DF对象private val frame: DataFrame = session.table("sz.emp1")//将上述DF对象的数据保存到temp1表中. 模式为追加模式.要求DataFrame的schema与表的schema相同.frame.write.mode(SaveMode.Append).insertInto("sz.temp1")session.stop()
}

再比如

//向表t2中写入数据,如不存在,则创建
scala>
Seq((1,2)).toDF("i","j").write.mode("overwrite").saveAsTable("t2")
//insertInto只基于位置的解析,与名字无关
scala> Seq((3,4)).toDF("j","i").write.insertInto("t2")
//insertInto只基于位置的解析,与名字无关
scala> Seq((5,6)).toDF("a","b").write.insertInto("t2")
//查看结果
scala> sql("select * from t2").show
+---+---+
|  i|  j|
+---+---+
|  1|  2|
|  3|  4|
|  5|  6|
+---+---+

错误解决

如果报权
限错误,在hive所在机器执行如下进行授权

 hdfs dfs -chmod -R 777 /

总结

  • 读取数据,可以创建临时视图.利用sql方法查询
  • 写入数据,可以用saveAsTable方法或者insertInto方法. 其中saveAsTable会基于列名解析,而insertInto方法仅仅基于位置进行解析

spark与Hive的整合入门相关推荐

  1. Spark对接Hive:整合Hive操作及函数

    1.拷贝hive-site.xml文件到spark的conf目录下 2.[hadoop@hadoop002 bin]$ ./spark-shell --master local[2] --jars ~ ...

  2. Spark SQL实战(08)-整合Hive

    1 整合原理及使用 Apache Spark 是一个快速.可扩展的分布式计算引擎,而 Hive 则是一个数据仓库工具,它提供了数据存储和查询功能.在 Spark 中使用 Hive 可以提高数据处理和查 ...

  3. spark代码连接hive_Spark SQL入门到实战之(7)spark连接hive(spark-shell和eclipse两种方式)...

    1.在服务器(虚拟机)spark-shell连接hive 1.1 将hive-site.xml拷贝到spark/conf里 cp /opt/apache-hive-2.3.2-bin/conf/hiv ...

  4. spark之1:快速入门

    spark之1:快速入门 @(SPARK)[spark, 大数据] spark可以通过交互式命令行及编程两种方式来进行调用: 前者支持scala与python 后者支持scala.python与jav ...

  5. Spark 连接hive local

    采用读取recources文件夹下的配制文件方式hive-site.xml 一.通过hiveserver2 服务连接 $HIVE_HOME/bin/hiveserver2 object NewSpar ...

  6. 漫谈大数据 - Spark on Hive Hive on Spark

    目录 Spark on hive 与 Hive on Spark 的区别 Hive查询流程及原理 Hive将SQL转成MapReduce执行速度慢 Hive On Spark优化 Hive元数据库的功 ...

  7. 【Spark+Hadoop+Hive+MySQL+Presto+SpringBoot+Echarts】基于大数据技术的用户日志数据分析及可视化平台搭建项目

    目录 1.项目概述 1.1.项目背景 1.2.项目流程 2.功能需求描述 2.1.系统功能组成 2.2.数据描述 2.3.功能描述 2.3.1.流量概况分析 2.3.2.日新日活分析 2.3.3.交互 ...

  8. 2021年大数据Spark(三十一):Spark On Hive

    目录 Spark On Hive spark-sql中集成Hive Spark代码中集成Hive Spark On Hive Spark SQL模块从发展来说,从Apache Hive框架而来,发展历 ...

  9. Spark采坑系列(三)Spark操作Hive的坑

    2019独角兽企业重金招聘Python工程师标准>>> 跟着教学试着用Idea编程,实现Spark查询Hive中的表.结果上来就凉了. 捣鼓好久都不行,在网上查有说将hive-sit ...

最新文章

  1. 你的生产型ML复现不了,可能是工作流程出了问题
  2. Dask.distributed创建client时出现报错
  3. hyperworks2019安装教程
  4. Selenium - CSS Selector
  5. Spring注解编程基石(一)
  6. 怎么把线稿提取出来_如何快速提取漫画线稿?【漫画技巧】
  7. 一起学习linux之lamp脚本
  8. delphi 同盘移动文件所用时间测试(文件大小约6,083,545,088 字节)
  9. php后台修改_ThinkPHP实现在可视化后台管理永久修改_php
  10. 秒杀面试 - 程序员面试宝典
  11. Cortex-M0芯片GPIO详解
  12. 概率统计Python计算:单个正态总体均值的双侧区间估计
  13. 专访爱情公寓CEO张家铭:中国SNS网站格局已定
  14. linux在双系统中消失了,win和linux双系统下,重装win系统导致linux系统消失的解决办法...
  15. 编程题--疯狂序列----京东大数据笔试
  16. python概率编程_Python概率编程库PyMC应用案例二则,pymc应用案例
  17. Android的IPC
  18. 数据库中decimal
  19. linux基础培训ppt,Linux 基础培训.ppt
  20. iOS 【如何写出最简洁优雅的网络封装 Moya + RxSwift】

热门文章

  1. 盐城计算机考试时间安排,2019盐城中考具体时间安排 什么时候考试
  2. swagger 返回json字符串_[Swagger] Swagger Codegen 高效开发客户端对接服务端代码
  3. 通过内网穿透 将本地端口 使其外网可以进行访问 使用花生壳内网穿透 网站访问
  4. Android Studio生成函数注释
  5. ps人像精修照片步骤_15天零基础自学PS!送你整套PS教程297集+视频+素材+源文件模板6...
  6. 交换机启用光口命令_华为光交换机查看光模块命令
  7. telnet发送socket报文_简单讲解一下Socket网络编程
  8. python输入一个字符串、计算其中小写字符的个数_编写程序,输入一个字符串,统计其中大小写字母数字和其他符号的个数并输出,要求统计过程在函数COUNT中进行...
  9. vue一个页面用两个以上页面 时时刷新
  10. oracle怎样查询能利用索引,oracle怎样查询索引的使用情况