【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.mzph.cn/news/220041.shtml

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

相关文章

Collecting Application Engine Performance Data 收集应用程序引擎性能数据

You can collect performance data of any specific SQL action of an Application Engine program to address any performance issue. 您可以收集应用程序引擎程序的任何特定SQL操作的性能数据,以解决任何性能问题。 You can collect performance data of the S…

【虹科分享】基于Redis Enterprise,LangChain,OpenAI 构建一个电子商务聊天机器人

如何构建你自己的商务聊天机器人?注意哦,是你自己的聊天机器人。一起来看看Redis Enterprise的向量检索是怎么帮你实现这个愿望的吧。 鉴于最近人工智能支持的API和网络开发工具的激增,似乎每个人都在将聊天机器人集成到他们的应用程序中。 …

原生cesium、mars3d、supermap-cesium在vue3+vite中引入

1. 原生cesium 需要下载 yarn add cesiumyarn add vite-plugin-cesium2. mars3d 需要下载 yarn add mars3d mars3d-cesiumyarn add vite-plugin-mars3d3. supermap-cesium 只需要引入官网下载的包,build文件夹下的cesium,以及项目中引入的其他cesiu…

【深度学习】PHP操作mysql数据库总结

一.PHP数据库的扩展分类 1.MySQL 扩展是针对 MySQL 4.1.3 或更早版本设计的,是 PHP 与 MySQL数据库交互的早期扩展。由于其不支持 MySQL 数据库服务器的新特性,且安全性差,在项目开发中不建议使用,可用 MySQLi 扩展代替。 2.MySQ…

Android BottomSheetBehavior(底部弹窗)

目录 一、BottomSheetBehavior 介绍 二、BottomSheetBehavior 基本使用 2.1 在 CoordinatorLayout 中添加底部工作表: 2.2 在代码中获取 BottomSheetBehavior 实例: 2.3 设置工作表的状态,如展开、折叠等 2.4 工作表的状态 三、Bottom…

嵌入式系统未来的发展趋势走向???

人工智能和机器学习应用 模型优化: 为了在资源有限的嵌入式系统上运行,将会看到更多的努力投入到精简、优化和量化模型,以适应边缘计算的环境。 边缘推理: 嵌入式设备将更多地执行本地推理,而不是将所有数据发送到云端…

【设计模式--行为型--命令模式】

设计模式--行为型--命令模式 命令模式定义结构案例优缺点使用场景 命令模式 定义 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储,传递,调用…

城轨线路列车时刻表与车站客流控制协同优化方法

文章信息 论文题目为《城轨线路列车时刻表与车站客流控制协同优化方法》,该文于2021年发表于《交通运输系统工程与信息》上。文章考虑换入客流影响下列车时刻表与客流控制的协同优化问题,以最小化乘车延误人数为目标,以列车时刻表、客流控制和…

java代码编写twitter授权登录

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

动物姿态估计:微调 YOLOv8 姿态模型

动物姿态估计是计算机视觉的一个研究领域,是人工智能的一个子领域,专注于自动检测和分析图像或视频片段中动物的姿势和位置。目标是确定一种或多种动物的身体部位(例如头部、四肢和尾巴)的空间排列。这项技术具有广泛的应用&#…

uniapp 单选按钮 选中默认设备

需求1:选中默认设备,113 和114 和139都可以选中一个默认设备 选中多个默认设备方法: async toSwitch(typeItem, title) {const res await this.setDefaultDev(typeItem.ibdr_devsn, typeItem.ibdr_pid)if (!res) {this.common.toast(切换默…

关于在Java中打印三角形图形的汇总

前面写过一些关于打印三角形图形代码的文章,这里进行了汇总,话不多说,直接上代码: /*** 关于打印三角形的汇总*/ public class Work1 {public static void main(String[] args) {int num 5;/** 打印如下图形:* ** …

OPCServer KEPServer安装和使用

OPCServer KEPServer安装和使用 简介 KEPServer软件是免费的,驱动收费,每天2小时试用时间, 免费用来模拟仿真是很不错的选择 OPC DA 和OPC UA都支持 中文官网地址: https://www.kepware.com/zh-cn/ 中文官方文档(经常有更新,其…

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

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

javaWebssh汽车销售管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh汽车销售管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

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

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

05-命令模式

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

Linux环境下maven的安装

到官网下载maven 步入下面的地址选择合适的maven版本 https://dlcdn.apache.org/maven/ 以笔者为例,选择了3.5.4这个版本 将maven上传到Linux服务器并解压 tar -zxvf apache-maven-3.5.4-bin.tar.gz配置环境变量 我们使用vim编辑profile vim /etc/profile环境…

【数据结构(十一·多路查找树)】B树、B+树、B*树(6)

文章目录 1. 二叉树 与 B树1.1. 二叉树存在的问题1.2. 多叉树 的概念1.3. B树 的基本介绍 2. 多叉树——2-3树2.1. 基本概念2.2. 实例应用2.3. 其他说明 3. B 树、B树 和 B*树3.1. B树 的介绍3.2. B树 的介绍3.2. B*树 的介绍 1. 二叉树 与 B树 1.1. 二叉树存在的问题 二叉树…

react Hooks(useEffect)实现原理 - 简单理解

useEffect 语法: useEffect(setup, dependencies?) 含义: useEffect 是一个 React Hook,它允许你 将组件与外部系统同步。 useEffect 源码简单理解 一、mountEffect 和 upadateEffect useEffect 与其它 hooks 一样分为 mountEffect 和 upadateEffec…