【Hive】

一、Hive是什么

  • Hive是一款建立在Hadoop之上的开源数据仓库系统,将Hadoop文件中的结构化、半结构化数据文件映射成一张数据库表,同时提供了一种类SQL语言(HQL),用于访问和分析存在Hadoop中的大型数据集。
  • Hive的核心是将HQL转换成MapReduce程序,然后将其提交到Hadoop集群执行。(用户只需要编写HQL而不需要编写MapReduce程序,减少了学习成本、开发成本。)
  • Hive利用HDFS存储数据,利用MapReduce查询分析数据
  • Hive能将数据文件映射成一张表,能将SQL编译成为MapReduce然后处理这个表
  • Hive的底层是用Java语言开发的
  • 小数据集使用Hive分析,延迟很高。大数据集使用Hive分析,底层使用MapReduce分布式计算,速度才快。因此Hive是使用在大数据的场景下。

二、Hive的架构图

  • hive能够写SQL的前提是针对一张表,而不是文件,因此要将文件和表之间的对应关系记录清楚。这个关系称为元数据信息

元数据信息记录:

  1. 表对应的什么文件(对应文件的位置)
  2. 表的每列对应文件的哪个字段,是什么类型(字段顺序,字段类型)
  3. 文件中各字段的分隔符是什么

Hive工作流程 :
在这里插入图片描述
Hive架构图:
在这里插入图片描述

  • Metastore元数据服务: 通常用mysql/derby等(关系型数据库)来存储表和文件的映射关系。Metastore服务用来管理metadata元数据,外部只能通过Metastore服务访问元数据的数据库。
  • Driver驱动程序: Hive的核心,包括语法解析器、计划编译器、优化器、执行器
  • 执行引擎: Hive不处理数据 ,而是由执行引擎处理,目前Hive支持MapReduece、Tez、Spark三种执行引擎。(Hive可以将SQL转换成MapReduce或Tez或Spark,默认是MapReduce)

三、Hive数据模型

Hive从数据模型上看与MySQL很相似,也有库、表、字段。
但是Hive只适合用来做海量数据的离线分析,Hive一般用于数仓,MySQL一般用于业务系统。

HiveMySQL
定位数据仓库数据库
使用场景离线数据分析业务数据事务处理
查询语言HQLSQL
数据存储HDFSLocal FS
执行引擎MR、Tez、SparkExcutor
执行延迟
处理数据规模
常见操作导入数据、查询增删改查
  • Hive中的数据可以在粒度级别上分成3类
    Table 表
    Partition 分区
    Bucket 分桶
  • 底层存储:
    数据库存储:itcast数据库对应的存储路径是/user/hive/warehouse/itcast.db(创建数据库相当于创建了个文件夹)
    表存储:itcast数据库下t_user表对应的存储路径/user/hive/warehouse/itcast.db/t_user
    partitions分区:分区是指根据分区列(例如“日期day”)的值将表划分为不同分区,一个文件夹表示一个分区,分区列=分区值
    在这里插入图片描述

Buckets分桶:分区是指根据表中字段(例如“编号ID”)的值,经过Hash计算规则将文件划分成指定的若干个小文件
在这里插入图片描述

四、Hive的各个组件

五、Hive SQL DDL建表语法(重点)

完整的建表语法:
在这里插入图片描述

  • 不是用loaction的情况下创建表相当于创建了一个文件夹,具体的数据文件需要放在对应的文件夹下
  • 也可以在建表语句中使用location关键字指定数据文件在hdfs上的位置
  • 一个表对应的文件夹下可以放多个数据文件,会一起解析成一张表

5.1 指定分隔符语法(关键字ROW FORMAT)

在这里插入图片描述

5.2 内部表与外部表(关键字EXTERNAL)

建表时用external关键字指定的就是外部表,否则为内部表(Managed Table)
当删除内部表时,会从MetaStore中删除表的元数据,从HDFS中删除表的数据。
当删除外部表时,只会从MetaStore中删除表的元数据,不会删除HDFS中表的数据。
内部表、外部表与是否使用location指定路径没有关系

5.3 分区表(关键字PARTITIONED BY)

当Hive表对应的数据量大,文件多时,为了避免查询时全表扫描(速度慢),可以根据指定的字段(比如:日期、地域)对表进行分区,本质上是通过多个文件夹来管理分区,例如下图的多重分区:

在这里插入图片描述

  • HDFS中分区表的存储方式:在这里插入图片描述

分区表中需要确保每个分区的数据文件是干净的,是和分区值所对应的,否则没有意义
分区表创建完,直接把数据文件移动到对应文件夹下是没用的,静态分区需要使用load data进行加载

静态分区举例:
静态分区指的是分区的字段值是手动写死的

-- 创建分区表,指定两个分区字段,province和city
create table t_user_province_city (id int, name string, age int) 
partitioned by (province string,city string);

-- 静态分区加载数据(静态分区指的是province和city手工指定)
load data local inpath '/root/hivedata/user.txt' into table t_user_province_city partiton(province='zhejiang',city='hangzhou');
load data local inpath '/root/hivedata/user.txt' into table t_user_province_city partiton(province='zhejiang',city='ningbo');

-- 使用分区表(不用全表扫描,直接找到对应分区下的文件)
select * from t_user_province_city where province='zhejiang' and city='hangzhou'

动态分区举例:
动态分区指的是分区的字段值是基于查询结果(参数位置)自动推断出来的。核心语法是insert+select

-- 创建分区表,指定两个分区字段,province和city
create table t_user_province_city (id int, name string, age int) 
partitioned by (province string,city string);

-- 动态分区(province和city并没有手动指定,而是从select中查出来的province_tmp和city_tmp)
insert into table t_user_province_city partion(province string,city string)
select tmp.*,tmp.province_tmp,tmp.city_tmp from t_user_province_city_tmp tmp

一、分区表不是建表的必要语法,是一种优化手段
二、分区字段不能是表中已有的字段
三、分区字段是虚拟字段,其数据并不存储在底层的文件中
四、分区字段值来自于手动指定(静态分区)或根据查询结果位置推断(动态分区)
五、Hive支持多重分区,可以在分区的基础上继续分区

5.4 分桶表(关键字CLUSTERED BY … INTO 分桶数 BUCKETS)

  • 分桶表对应的数据文件在底层会被分解为若干各独立的小文件(一个文件 —> n个文件,当某个分区数据量过大时,可以再进行分桶)
  • CLUSTERED BY指定根据哪几个字段进行分桶(字段必须是表中已经存在的字段)
  • into n buckets表示分成几桶(几部分文件)
  • 指定的字段如果字段一样,一定会分到一个桶中
    在这里插入图片描述

分桶表的好处:
1.基于分桶字段查询时,减少全表扫描(对分桶字段再次计算哈希,找到对应的分桶编号,只查询那一个文件即可)
2.用分桶的字段join时可以提高mr程序效率,减少笛卡尔积数量
在这里插入图片描述
3.分桶表数据进行高效抽样(分桶后可以从每个桶中抽取一定比例的数据,可以保证数据更加的平均)

创建分桶表举例:

create table itheima.t_usa_covid19_bucket(
	count_date string,
	country string,
	state string,
	fips int,
	cases int,
	deaths int
)
clustered by(state) into 5 buckets; -- 根据state分为5桶

create table itheima.t_usa_covid19_bucket(
	count_date string,
	country string,
	state string,
	fips int,
	cases int,
	deaths int
)
clustered by(state) 
sorted by (cases desc) into 5 buckets; -- 指定每个分桶内部根据cases降序排列

分桶表数据加载举例:

-- step1:把源数据加载到普通hive表中
create table itheima.t_usa_covid19(
	count_date string,
	country string,
	state string,
	fips int,
	cases int,
	deaths int
)
row format delimited fields terminated by ",";

-- 将源数据上传到HDFS,t_usa_covid19表对应的目录下
hadoop fs -put us-covid-counties.dat /user/hive/warehouse/itheima.db/t_usa_covid19
-- step2:使用insert+select语法将数据加载到分桶表中
insert into t_usa_covid19_bucket select * from t_usa_covid19

六、其他知识

6.1 四种排序order by、cluster by、distribute by、sort by

  • order by:全局排序,要汇总数据才能排序,因此只有一个reduce,排序效率低
  • cluster by:对某个字段分组且排序,并且只能升序,分的组数取决于reducetask的个数
  • distribute by + sort by:distribute by负责根据指定字段进行分组,sort by负责分组内排序,例如:
    select * from student distribute by sex sort by age desc;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/243250.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java代码编写twitter授权登录

在上一篇内容已经介绍了怎么申请twitter开放的API接口。 下面介绍怎么通过twitter提供的API,进行授权登录功能。 开发者页面设置 首先在开发者页面开启“用户认证设置”,点击edit进行信息编辑。 我的授权登录是个网页,并且只需要进行简单的…

Nginx快速入门

nginx准备 文本概述参考笔记 狂神:https://www.kuangstudy.com/bbs/1353634800149213186 前端vue打包 参考:https://blog.csdn.net/weixin_44813417/article/details/121329335 打包命令: npm run build:prod nginx 下载 网址&#x…

大模型应用_FastGPT

1 功能 整体功能,想解决什么问题 官方说明:FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景!个人体会…

竞赛保研 python 爬虫与协同过滤的新闻推荐系统

1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 python 爬虫与协同过滤的新闻推荐系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:4分 该项目较为新颖&…

道路坑洞数据集(坑洞目标检测)VOC+YOLO格式650张

路面坑洞的形成原因是由于设计、施工、养护处理不当、控制不适和受气候、环境、地质、水文等自然因素影响,以及车辆的运行和车辆超载运行导致路面破损,出现坑洞的现象。 路面坑洞的分类: (1)路面混凝土板中坑洞&…

如何使用 Redis 快速实现分布式锁?

本文我们来讨论如何使用 Redis 快速实现分布式锁。 分布式锁有很多种解决方案,前面简单介绍过,Redis 可以通过 set key 方式来实现分布式锁,但实际情况要更加复杂,比如如何确保临界资源的串行执行,如何及时释放&#…

人工智能_机器学习065_SVM支持向量机KKT条件_深度理解KKT条件下的损失函数求解过程_公式详细推导_---人工智能工作笔记0105

之前我们已经说了KKT条件,其实就是用来解决 如何实现对,不等式条件下的,目标函数的求解问题,之前我们说的拉格朗日乘数法,是用来对 等式条件下的目标函数进行求解. KKT条件是这样做的,添加了一个阿尔法平方对吧,这个阿尔法平方肯定是大于0的,那么 可以结合下面的文章去看,也…

node-static 任意文件读取漏洞复现(CVE-2023-26111)

0x01 产品简介 node-static 是 Node.js 兼容 RFC 2616的 HTTP 静态文件服务器处理模块,提供内置的缓存支持。 0x02 漏洞概述 node-static 存在任意文件读取漏洞,攻击者可通过该漏洞读取系统重要文件(如数据库配置文件、系统配置文件&#…

生信算法2 - DNA测序算法实践之序列统计

生信序列基本操作算法 建议在Jupyter实践,python版本3.9 1. 读取fastq序列 # fastq序列获取 !wget http://d28rh4a8wq0iu5.cloudfront.net/ads1/data/SRR835775_1.first1000.fastqdef readFastq(filename):# 序列列表sequences []# 质量值列表qualities []with…

一些程序源码及教程的网站合集~

很多时候我们需要一个快速上手的code demo及教程,除了最常用的【github】,一些中文网站可能会帮助我们更好上手~ 这里提供几个中文网站参考: 【51CTO】: Python 动态手势识别系统hmm 手势识别opencv_mob64ca140d96d9的技术博客…

5G工业物联网网关,比4G工业网关强在哪里?

​随着5G技术的广泛应用,越来越多的行业开始探索如何利用5G网络提升效率和创新能力。其中,工业物联网领域是受益最大的领域之一。作为连接物联网设备和网络的关键组件,5G工业物联网网关在这个变革中发挥着至关重要的作用。本文将深入探讨5G工…

【个人版】SpringBoot下Spring-Security核心概念解读【二】

Spring-Security HttpSecurity Spring-Security全局导读: 1、Security核心类设计 2、HttpSecurity结构和执行流程解读 3、Spring-Security个人落地篇 背景: Spring-Security框架的核心架构上一篇已经概述,展示其执行流程及逻辑,但…

科技提升安全,基于DETR【DEtection TRansformer】模型开发构建商超扶梯场景下行人安全行为姿态检测识别系统

在商超等人流量较为密集的场景下经常会报道出现一些行人在扶梯上摔倒、受伤等问题,随着AI技术的快速发展与不断普及,越来越多的商超、地铁等场景开始加装专用的安全检测预警系统,核心工作原理即使AI模型与摄像头图像视频流的实时计算&#xf…

使用对象处理流ObjectOutputStream读写文件

注意事项: 1.创建的对象必须实现序列化接口,如果属性也是类,那么对应的类也要序列化 2.读写文件路径问题 3.演示一个例子 (1)操作的实体类FileModel,实体类中有Map,HashMap这些自带的本身就实现了序列化。 public class File…

运行和部署若依分离版前端

一、运行 一、用vscode打开 二、安装依赖 # 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 npm install --registryhttps://registry.npmmirror.com# 启动服务 npm run dev浏览器访问 http://localhost:80二、部…

死锁(面试常问)

1.什么是死锁 简单来说就是一个线程加锁后解锁不了 一个线程,一把锁,线程连续加锁两次。如果这个锁是不可重入锁,会死锁。两个线程,两把锁。 举几个例子,1.钥匙锁车里了,车钥匙锁家里了。2. 现在有一本书…

两线制输入馈电型隔离变送器

两线制输入馈电型隔离变送器 产品型号:JSD TA-1021系列 馈电型隔离变送器产品介绍: JSD TA-1021 为两线制输入馈电型高精度隔离变送器,是将输入与输出之间电气绝缘的模拟信号量进行变换、放大、隔离及远传的小型仪表设备,接收仪表…

代码随想录算法训练营Day1 | 704.二分查找、27.移除元素

LeetCode 704 二分查找 题目链接:704.二分查找 本题思路:本题题目写的是二分查找,所以我们用到的算法肯定也是二分查找,需要定义 3个变量。 l: 从数组的下标0开始 r: 数组长度 - 1 mid:(l r)…

SQL进阶理论篇(二):数据库的设计范式

文章目录 简介数据库的设计范式有哪些数据库中的几种键从1NF到3NF1NF2NF3NFBCNF(巴斯范式) 反范式设计反范式的适用场景总结参考文献 简介 本小节主要内容: 数据库的设计范式都有哪些数据库的键都有哪些1NF、2NF和3NF都是指什么&#xff1f…

基于Dockerfile创建LNMP

实验组件 172.111.0.10:nginx docker-nginx 172.111.0.20:mysql docker-mysql 172.111.0.30:php docker-php 实验步骤 1.建立nginx-lnmp镜像及容器 cd /opt mkdir nginx cd nginx/ --上传nginx-1.22.0.tar.gz和wordpress-6.4.2-zh_C…
最新文章