【Hive】

news2024/12/23 12:52:49

一、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.coloradmin.cn/o/1308895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第一届古剑山ctf-pwn全部题解

1. choice 附件: https://github.com/chounana/ctf/blob/main/2023%E7%AC%AC%E4%B8%80%E5%B1%8A%E5%8F%A4%E5%89%91%E5%B1%B1pwn/choice.zip 漏洞代码: 漏洞成因: byte_804A04C输入的长度可以覆盖nbytes的值,导致后面输入时存…

数据管理与持久化:深度解析Docker数据卷

Docker 数据卷在容器化应用中扮演着关键角色,它们提供了一种灵活且可持久化的方式来处理应用数据。本文将深入讨论 Docker 数据卷的基本概念、使用方法以及一系列高级应用场景,通过更为丰富和实际的示例代码,帮助大家全面掌握数据卷的使用和管…

Impala4.x源码阅读笔记(二)——Impala如何高效读取Iceberg表

前言 本文为笔者个人阅读Apache Impala源码时的笔记,仅代表我个人对代码的理解,个人水平有限,文章可能存在理解错误、遗漏或者过时之处。如果有任何错误或者有更好的见解,欢迎指正。 Iceberg表是一种用于存储大规模结构化数据的…

市场全局复盘 20231213

昨日回顾: SELECT TOP 10000 CODE,成交额排名,净流入排名,代码,名称,DDE大单金额,涨幅 ,主力净额,DDE大单净量,CONVERT(DATETIME, 最后封板, 120) AS 最后封板 FROM dbo.全部A股20231213_ALL WHERE 连板天 > 1AND DDE大单净量 > 0AND DDE散户数量…

bugku--source

dirsearch扫一下 题目提示源代码(source) 也就是源代码泄露,然后发现有.git 猜到是git泄露 拼接后发现有文件 但是点开啥也没有 kali里面下载下来 wegt -r 下载网站的所有内容 ls 查看目录 cd 进入到目录里面 gie reflog 引用日志使用…

Cent OS7 磁盘挂载:扩展存储空间和自动挂载

文章目录 (1)概述(2)查看磁盘使用情况(3)VMware虚拟机挂载磁盘(4)物理机磁盘挂载(5)ntfs硬盘处理 (1)概述 在Linux系统中&#xff0c…

ubuntu 自动安装 MKL Intel fortran 编译器 ifort 及完美平替

首先据不完全观察,gfortran 与 openblas是 intel fortran 编译器 ifotr和mkl的非常优秀的平替,openblas连函数名都跟mkl一样,加了一个下划线。 1, 概况 https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-too…

【Hadoop】Hadoop基础架构的变化

1.x版本架构2.x版本架构3.x版本架构参考 1.x版本架构 NameNode:,负责文件系统的名字空间(Namespace)管理以及客户端对文 件的访问。NameNode负责文件元数据的管理和操作。是单节点。 Secondary NameNode:它的职责是合并NameNode的edit logs到…

SpringBoot进行自然语言处理,利用Hanlp进行文本情感分析

. # 📑前言 本文主要是SpringBoot进行自然语言处理,利用Hanlp进行文本情感分析,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风…

人工智能导论习题集(3)

第五章:不确定性推理 题1题2题3题4题5题6题7题8 题1 题2 题3 题4 题5 题6 题7 题8

过滤(删除)迭代对象中满足指定条件的元素itertools.filterfalse()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 过滤(删除)迭代对象中 满足指定条件的元素 itertools.filterfalse() [太阳]选择题 请问以下代码输出的结果是? a [1, 2, 3, 4, 5] print("【显示】a ",a) import ite…

关于Cython生成的so动态链接库逆向

来个引子:TPCTF的maze题目 如何生成这个so文件 为了研究逆向,我们先搞个例子感受一下生成so的整个过程,方便后续分析 创建对应python库文件 testso.py def test_add(a,b):a int(a)b int(b)return a bdef test_calc(li):for i in range…

redis-学习笔记(Jedis zset 简单命令)

zadd & zrange zadd , 插入的第一个参数是 zset , 第二个参数是 score, 第三个参数是 member 成员 内部依据 score 排序 zrange 返回 key 对应的 对应区间内的值 zrangeWithScore 返回 key 对应的 对应区间内的值和分数 示例代码 zcard 返回 key 对应的 zset 的长度 示例代…

05-命令模式

意图(GOF定义) 将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化,对请求排队或者记录日志,以及可支持撤销的操作。 理解 命令模式就是把一些常用的但比较繁杂的工作归类为成一组一组的动作&…

使用 Taro 开发鸿蒙原生应用 —— 当 Taro 遇到纯血鸿蒙 | 京东云技术团队

纯血鸿蒙即将到来 在今年 8 月的「2023年华为开发者大会(HDC.Together)」上,华为正式官宣「鸿蒙Next」,这个更新的版本将移除所有的 AOSP 代码,彻底与 Android 切割,使其成为一个完全自主研发的操作系统&a…

【视觉SLAM十四讲学习笔记】第四讲——指数映射

专栏系列文章如下: 【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM 【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵 【视觉SLAM十四讲学习笔记】第三讲——旋转向量和欧拉角 【视觉SLAM十四讲学习笔记】第三讲——四元…

LeetCode008之字符串转换整数 (相关话题:状态机)

题目描述 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C 中的 atoi 函数)。 函数 myAtoi(string s) 的算法如下: 读入字符串并丢弃无用的前导空格检查下一个字符(假设还…

以太网协议与DNS

以太网协议 以太网协议DNS 以太网协议 以太网用于在计算机和其他网络设备之间传输数据,以太网既包含了数据链路层的内容,也包含了物理层的内容. 以太网数据报: 其中目的IP和源IP不是网络层的目的IP和源IP,而是mac地址.网络层的主要负责是整体的转发过程,数据链路层负责的是局…

分库分表及ShardingShpere-proxy数据分片

为什么需要分库? 随着数据量的急速上升,单个数据库可能会QPS过高导致读写耗时过长而出现性能瓶颈,所以需要考虑拆分数据库,将数据库分布在不同实例上提升数据库可用性。主要的原因有如下: 磁盘存储。业务量剧增&…

bugku--Simple_SSTI_1---2

第一题 看到一句话,需要传入一个传参为flag 设置一个变量为 secret_key 构造paykoad /?flagsecret_key 但是发现什么都没有 SSTI模版注入嘛 这里使用的是flask模版 Flask提供了一个名为config的全局对象,可以用来设置和获取全局变量。 继续构造pa…