Spark-Sql快速入门系列(5) | Hive数据库_df.write-程序员宅基地

技术标签: spark  Spark-sql  大数据  

一.hive和spark sql的集成方式(面试可能会问到)

在这里插入图片描述
hive on spark(版本兼容)
官网https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark%3A+Getting+Started
在这里插入图片描述
spark on hive(版本兼容)
官网
http://spark.apache.org/docs/2.1.1/sql-programming-guide.html#hive-tables
在这里插入图片描述

二.spark_shell和spark_sql操作

spark_shell

在这里插入图片描述
如果你在集群上使用了tez,你需要在spark/conf下spark-defaults.conf添加lzo的路径

spark.jars=/export/servers/hadoop-2.7.7/share/hadoop/common/hadoop-lzo-0.4.20.jar

spark-yarn模式启动

bin/spark-shell --master yarn

spark_sql

完全跟sql一样
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用hiveserver2 + beeline

spark-sql 得到的结果不够友好, 所以可以使用hiveserver2 + beeline
1.启动thriftserver(后台)

sbin/start-thriftserver.sh

2.启动beeline

bin/beeline
# 然后输入
!connect jdbc:hive2://hadoop102:10000
# 然后按照提示输入用户名和密码

在这里插入图片描述

三.脚本使用spark-sql

在这里插入图片描述

四.idea中读写Hive数据

1.从hive中读数据

在这里插入图片描述
添加依赖

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-hive_2.11</artifactId>
    <version>2.1.1</version>
</dependency>

代码实现

import org.apache.spark.sql.SparkSession

object HiveRead {
    
  def main(args: Array[String]): Unit = {
    
    val spark = SparkSession
      .builder()
      .master("local[*]")
      .appName("HiveRead")
      //添加支持外置hive
      .enableHiveSupport()
      .getOrCreate()

    spark.sql("show databases")
    spark.sql("use guli")
    spark.sql("select count(*) from gulivideo_orc").show()

    spark.close()
  }

}

结果
在这里插入图片描述

2.从hive中写数据

在这里插入图片描述

使用hive的insert语句去写

import org.apache.spark.sql.SparkSession

object HiveWrite {
    
  def main(args: Array[String]): Unit = {
    
    System.setProperty("HADOOP_USER_NAME", "root");
    val spark = SparkSession
      .builder()
      .master("local[*]")
      .appName("HiveRead")
      //添加支持外置hive
      .enableHiveSupport()
      .config("spark.sql.warehouse.dir","hdfs://hadoop102:9000/user/hive/warehouse")
      .getOrCreate()

    //先创建一个数据库
    spark.sql("create database spark1602")
    spark.sql("use spark1602")
    spark.sql("create table user1(id int,name string)")
    spark.sql("insert into user1 values(10,'lisi')").show()

    spark.close()

  }
}

使用df.write.saveAsTable(“表名”)(常用)

import org.apache.spark.sql.SparkSession

object HiveWrite {
    
  def main(args: Array[String]): Unit = {
    
    System.setProperty("HADOOP_USER_NAME", "root");
    val spark = SparkSession
      .builder()
      .master("local[*]")
      .appName("HiveRead")
      //添加支持外置hive
      .enableHiveSupport()
      .config("spark.sql.warehouse.dir","hdfs://hadoop102:9000/user/hive/warehouse")
      .getOrCreate()


    val df = spark.read.json("D:\\idea\\spark-sql\\input\\user.json")
    spark.sql("use spark1602")
    //直接把数据写入到hive中,表可以存在也可以不存在
    df.write.saveAsTable("user2")
    //也可以进行追加
   //df.write.mode("append").saveAsTable("user2")
    spark.close()

  }

}

使用df.write.insertInto(“表名”)

import org.apache.spark.sql.SparkSession

object HiveWrite {
    
  def main(args: Array[String]): Unit = {
    
    System.setProperty("HADOOP_USER_NAME", "root");
    val spark = SparkSession
      .builder()
      .master("local[*]")
      .appName("HiveRead")
      //添加支持外置hive
      .enableHiveSupport()
      .config("spark.sql.warehouse.dir","hdfs://hadoop102:9000/user/hive/warehouse")
      .getOrCreate()


    val df = spark.read.json("D:\\idea\\spark-sql\\input\\user.json")
    spark.sql("use spark1602")
    df.write.insertInto("user2")

    spark.close()
  }

}

3.saveAsTable和insertInto的原理

saveAsTable
使用列名进行分配值
在这里插入图片描述

insertInto
按照位置进行1对1
在这里插入图片描述

五.聚合后的分区数

import org.apache.spark.sql.SparkSession

object HiveWrite {
    
  def main(args: Array[String]): Unit = {
    
    System.setProperty("HADOOP_USER_NAME", "root");
    val spark = SparkSession
      .builder()
      .master("local[*]")
      .appName("HiveRead")
      //添加支持外置hive
      .enableHiveSupport()
      .config("spark.sql.warehouse.dir","hdfs://hadoop102:9000/user/hive/warehouse")
      .getOrCreate()

    val df = spark.read.json("D:\\idea\\spark-sql\\input\\user.json")
    df.createOrReplaceTempView("a")

    spark.sql("use spark1602")
    val df1 = spark.sql("select * from a ")
    val df2 = spark.sql("select sum(age) sum_age from a group by name")
    println(df1.rdd.getNumPartitions)
    println(df2.rdd.getNumPartitions)
   df1.write.saveAsTable("a3")
   df2.write.saveAsTable("a4")

    spark.close()
  }

}

结果:聚合函数分区数默认200个
在这里插入图片描述
如果数据量小,没必要200两个分区,简直浪费

 df2.write.saveAsTable("a4")

修改为

 df2.coalesce(1).write.saveAsTable("a4")
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_46548855/article/details/108279969

智能推荐

Spring RestTemplate post方法-程序员宅基地

文章浏览阅读539次。好久没写没写博客了,这个习惯可不能丢。学习还是需要不断积累的。三流程序员更不能懈怠。感觉似乎立即就要被淘汰。Spring RestTemplate Post方法因为项目本身就是使用为服务架构,所以不可避免地使用了spring boot的东西。现在关于面向资源的restful这么流行,所以老板说啥就是啥了。是一个接口需要升级,以前的一些json参数需要调整,url地址也发生了变化。(另一个团..._spring resttemplate post

ES6--箭头函数-程序员宅基地

文章浏览阅读1.7k次。ES6--箭头函数this转自ES6标准新增了一种新的函数:Arrow Function(箭头函数)。为什么叫Arrow Function?因为它的定义用的就是一个箭头:x => x * x上面的箭头函数相当于:function (x) { return x * x}箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式,一种像上面的,只包含一个表达式(放在同一行..._es6--箭头函数

java实现Oracle批量数据传输-jdbc方式_oracle批处理java-程序员宅基地

文章浏览阅读946次。废话不多说,直接上代码:import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class TestService { publ._oracle批处理java

css中em和rem的区别-程序员宅基地

文章浏览阅读81次。在css中单位长度用的最多的是px、em、rem,这三个的区别是:  px是固定的像素,一旦设置了就无法因为适应页面大小而改变。  em和rem相对于px更具有灵活性,他们是相对长度单位,意思是长度不是定死了的,更适用于响应式布局。对于em和rem的区别一句话概括:em相对于父元素,rem相对于根元素。rem中的r意思是root(根源),这也就不难理解了。em..._css rem 与 em的区别

计算机文件夹不能在桌面显示不出来,计算机桌面不能显示了,该怎么处理啊?-程序员宅基地

文章浏览阅读3.3k次。如果是无意弄丢桌面图标用ctrl+alt+del然后在任务管理器中点“新任务”然后运行“explorer.exe”即可。如果是病毒原因可按照下面方法形式(from 互联网} 1.更改文件夹选项,在文件夹选项--查看中选择“显示所有文件和文件夹”,去掉“隐藏受保护的操作系统文件(推荐)”前面的勾。   2.删除移动硬盘中3个文件:autorun.inf、EXPLORER.EXE、wsctf.exe..._文件夹打开不显示在桌面上

流媒体 - opencv采集rtsp实时流数据_android opencv获取rtsp视频流-程序员宅基地

文章浏览阅读1.5k次。opencv直接采集rtsp流opencv源码下载ubuntu18.04 命令行安装采集rtsp流数据cmake编译文件opencv源码下载git clone https://github.com/opencv/opencv.gitubuntu18.04 命令行安装查找是否安装opencvpkg-config opencv --libs安装sudo apt inst..._android opencv获取rtsp视频流

随便推点

LLMs:《A Survey on Evaluation of Large Language Models大型语言模型评估综述》理解智能本质(具备推理能力)、AI评估的重要性(识别当前算法的局限性+设-程序员宅基地

文章浏览阅读3.3k次,点赞7次,收藏15次。​LLMs:《A Survey on Evaluation of Large Language Models大型语言模型评估综述》翻译与解读LLMs:大型语言模型评估研究综述—理解智能本质(具备推理能力)、AI评估的重要性(识别当前算法的局限性+设计更强大模型的关键工具)、评估LLMs的四大意义、三维度(What+Where+How)综述LLMs评估、LLMs大语言模型的三大关键(Transformer+RLHF+提示工程)、评估LLMs任务六大类(NLURG+REBT+SS+NS+MA+Agent_a survey on evaluation of large language models

Tomcat报错 java.lang.IllegalStateException: 鍚姩瀛愮骇鏃跺嚭閿�_鍚 姩瀛愮骇鏃跺嚭閿-程序员宅基地

文章浏览阅读2.3k次。如果在IDEA上运行Tomcat报错java.lang.IllegalStateException: 鍚姩瀛愮骇鏃跺嚭閿� 那么就要检查自己的web.xml文件或者pro.xmlwen'jian_鍚 姩瀛愮骇鏃跺嚭閿

移植linux4.14内核到四核Exynos4412开发板_linux内核移植-程序员宅基地

文章浏览阅读668次。最近法师收到了很多留言,其中有一部分问法师什么时候更新,还有一大部分问法师我是买迅为的IMX6UL精英版好呢还是买4412精英版好呢,因为我们这俩个都不贵。法师的建议的是入手4412!为什么呢? 第一,4412是三星第一款经典处理器,为三星创造了辉煌,是当年在国内红得发紫的GalaxyS3手机的主控,他的出现,开启了手机和平板的四核时代,让手机和平板变得流畅,可以说,到目前为止,4..._linux内核移植

Oracle 数据库中删除表空间的详细步骤与示例-程序员宅基地

文章浏览阅读5.7k次,点赞3次,收藏13次。在 Oracle 数据库中,表空间是存储数据的逻辑容器。有时候,我们可能需要删除不再使用的表空间以释放空间或进行数据库重组。本文将详细介绍在 Oracle 数据库中删除表空间的步骤和示例代码。通过本文,你已经了解了在 Oracle 数据库中删除表空间的详细步骤和示例代码。删除表空间是一个敏感且重要的操作,请在进行操作前充分备份和测试,以确保数据的安全和稳定。希望本文对你在 Oracle 数据库管理中的工作有所帮助。如果你有任何问题或疑问,欢迎留言讨论。_删除表空间

stm32外部内存的使用_stm32f 外置内存-程序员宅基地

文章浏览阅读843次。申请某些较大的结构体数组时,直接使用32可能会因为内存不足报错,此时可以尝试使用外部内存SRAM,使用代码如下struct Radar_data Radar[RA_SPACE] attribute((at(0x68000220))); //雷达数据#define NEXT1ADDR 0x68000220+sizeof(struct Radar_data)*RA_SPACEstruct TIS_area TisArea[TIS_SPACE] attribute((at(N_stm32f 外置内存

Redis 越来越慢?常见延迟问题定位与分析-程序员宅基地

文章浏览阅读1.7k次。Redis作为内存数据库,拥有非常高的性能,单个实例的QPS能够达到10W左右。但我们在使用Redis时,经常时不时会出现访问延迟很大的情况,如果你不知道Redis的内部实现原理,在排查..._redis中的servercron如果数值很大延迟是否很大

推荐文章

热门文章

相关标签