大数据系列——什么是hive?hive用来干什么的?hive常见问题是啥?

news2024/11/24 8:04:20

目录

一、什么是hive

二、为什么要使用Hive

三、Hive与Hadoop的关系

四、Hive与HDFS的关系 

五、Hive与传统数据库区别

六、Hive中的数据存储是怎样的 

七、对hive进行增删改查

八、排序逻辑

九、hive不支持update数据的解决方案

十、Hive中支持的分区类型有两种

十一、内置函数

十二、hive表数据倾斜问题

1、什么是数据倾斜

2、容易导致数据倾斜的场景

3、数据倾斜会引发什么问题

4、优化思路

十三、Map/Reduce gc严重

优化思路

十四、map/reduce平均运行时间过长

优化思路

十五、MapTask过多,调度开销大

优化思路


一、什么是hive

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能,适合离线数据处理。

 

二、为什么要使用Hive

直接使用hadoop很难受,如 学习成本太高、MapReduce实现复杂查询逻辑时的开发难度太大。

hive解决了这方面问题:接口采用类SQL语法(避免了去写MapReduce),提供快速开发的能力

三、Hive与Hadoop的关系

四、Hive与HDFS的关系 

Hive利用HDFS存储数据,利用MapReduce查询数据

五、Hive与传统数据库区别

总结:hive具有sql数据库的外表,但应用场景完全不同,hive只适合用来做批量数据统计分析

ps: 类似MySQL

六、Hive中的数据存储是怎样的 

1、Hive中所有的数据都存储在 HDFS 中,没有专门的数据存储格式(可支持Text,SequenceFile,ParquetFile,RCFILE等)

2、只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。

3、Hive 中包含以下数据模型:DB、Table,External Table,Partition,Bucket。

 db:在hdfs中表现为${hive.metastore.warehouse.dir}目录下一个文件夹

table:在hdfs中表现所属db目录下一个文件夹

external table:外部表, 与table类似,不过其数据存放位置可以在任意指定路径

普通表: 删除表后, hdfs上的文件都删了

External外部表删除后, hdfs上的文件没有删除, 只是把文件删除了

partition:在hdfs中表现为table目录下的子目录

bucket:桶, 在hdfs中表现为同一个表目录下根据hash散列之后的多个文件, 会根据不同的文件把数据放到不同的文件中


1)对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。

2)Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

七、对hive进行增删改查

1、分区表的建表:

create table TEST_TABLE

(

Field1 STRING COMMENT  '字段1'

,Field2 STRING COMMENT  '字段2' 

,Field3 DECIMAL(18,7) COMMENT  '字段3'

,Field4 INT COMMENT  '字段4'

,Field5 DATE COMMENT  '字段5'

,Field6 SMALLINT COMMENT  '字段6'

)

COMMENT  '测试表'

PARTITIONED BY 

(PRT_DT STRING COMMENT  '分区日期'
)

STORED AS Orc;

2、非分区表的建表:

create table TEST_TABLE_NO

(

Field1 STRING COMMENT  '字段1'

,Field2 STRING COMMENT  '字段2' 

,Field3 DECIMAL(18,7) COMMENT  '字段3'

,Field4 INT COMMENT  '字段4'

,Field5 DATE COMMENT  '字段5'

,Field6 SMALLINT COMMENT  '字段6'

)

COMMENT  '测试表NO'

STORED AS Orc

;


3、删除表 DROP TABLE TEST_TABLE;

4、清空表 truncate table source_city_list_pr_date_creator;

5、插入数据

--1、分区表插入数据
1)INSERT INTO TABLE TEST_TABLE PARTITION (PRT_DT = '2021-02-18')VALUES ('11','22',33,44,'2021-02-05',66);

2)静态分区方式,从另一个表插入数据

INSERT INTO TABLE TEST_TABLE PARTITION (PRT_DT = '2021-02-20') SELECT * FROM TEST_TABLE_NO;
--2、非分区表插入数据

INSERT INTO TABLE TEST_TABLE_NO VALUES ('1','2',3,4,'2021-02-05',6);


6、删除一个分区数据
ALTER TABLE table_name DROP PARTITION (dt='20200909');
7、删除多个分区数据
ALTER TABLE table_name DROP PARTITION (dt >="20200901",dt <='20200930')
8、删除多字段分区
ALTER TABLE table_name DROP PARTITION (dt='2020901', hour='10');

9、 删除分区内部的部分数据,这时使用重写方式对满足条件的分区进行 overwrite 操作,并通过 where 来限定需要的信息,未过滤的的信息将被删除

insert overwrite table table_name partition(partition_name='value') 
select column1,column2,column2 FROM table_name
where partition_name='value' and column2 is not null


10、设置分区大小

set hive.exec.dynamic.partition=true;  
set hive.exec.dynamic.partition.mode=nonstrict; 
set hive.exec.max.dynamic.partitions.pernode=10000;
set hive.exec.max.dynamic.partitions=100000;

11、查看分区
show partitions tableName;


12、查看表信息

show create table tableName;
desc tableName

13、从csv导入数据/加载数据

load data inpath '/user/test/test1.csv' into table source_city_list_pr_date_creator;
load data inpath '/test/pt_hour=2022072400' into table ods_binlog_test  partition (dt='2022072400')


14、重命名表:

--ALTER TABLE [原表名] RENAME TO [新表名]

ALTER TABLE TEST_TABLE RENAME TO TEST_TABLE2;

八、排序逻辑

1、order by  order by是与关系型数据库的用法是一样的。select * from emp order by empno desc; 

针对全局数据进行排序,所以最终只会有1个reduce,因为一个reduce对应一个输出文件,全局排序的话只能有一个输出文件,这个是不受hive的参数控制的。如果要查询的结果集数据量比较大的话,只有一个reduce运行,那么效率会非常低,所以在实际应用中一定要谨慎使用order by。


2、sort by  对每一个reduce内部进行排序,而对全局结果集来说是没有进行排序的。
1)一般在实际使用中会比较经常使用sort by。

2)需要先设置reduce的数量; 设置执行时reduce的个数: set mapreduce.job.reduces=<number> 查询语句为: select * from emp sort by empno asc;

3)可以看到每个输出结果的文件中的数据都是按empno进行排好序的。


3、distribute by  类似于MapReduce中的partition的功能,对数据进行分区,一般和sort by结合进行使用。 以员工表为例,按照部门进行排序的查询语句写法如下: insert overwrite local directory '/opt/datas/distby-res' select * from emp distribute by deptno sort by empno asc


注意,distribute by必须要在sort by之前,原因是要先进行分区,然后才能进行排序。

第一个文件的部门编号是30,第二个文件的部门编号是10,第三个部门编号是20。然后每个部门的员工数据都是按照员工编号进行升序排列的。

4、cluster by
cluster by是sort by和distribute by的组合,当sort by和distribute by的字段相同的时候,可以使用cluster by替代。

1)参考查询语句如下: insert overwrite local directory '/opt/datas/clustby-res' select * from emp cluster by empno ; 

2)注意,cluster by 后面不能指定desc或者asc,否则会报错。

总结:

order by : 全局排序,一个reduce

sort by: 每个reduce内部排序,全局不排序

distribute by:分区排序,需要结合sort by使用

cluster by: 当sort by和distribute by的字段相同的时候使用

九、hive不支持update数据的解决方案

更新数据:

频繁的update和delete操作已经违背了hive的初衷。不到万不得已的情况,还是使用增量添加的方式最好。

方法1:
insert overwrite table table1

select id,修改后的内容 as cols from table1 where id = 你修改行的id  ----------先弄出你要修改的那个增量行

union all  --------最后合并起来就得到所有的行

select * from table1 where id !=你想修改的内容的所在id   ----------然后弄出排除旧行所剩余的所有行


方法2:用select 字段值 字段插入一条数据到表里
https://www.cnblogs.com/meirenyu/p/16575306.html

十、Hive中支持的分区类型有两种

•静态分区(static partition)

•动态分区(dynamic partition)

两者的区别:

主要在于静态分区需要手动指定,而动态分区是基于查询参数的位置去推断分区的名称,从而建立分区。

总的来说就是,静态分区的列是在编译时期通过用户传递来决定的;动态分区只有在SQL执行时才能确定。

十一、内置函数

round(double a)	ceil(double a)	

upper(string A) lower(string A)

trim(string A)

year(string date) month(string date) day(string date)

sum(col), sum(DISTINCT col)
count(*), count(expr),
min(col) max(col)

十二、hive表数据倾斜问题

1、什么是数据倾斜

一个或少数reduce task处理的数据量远超其他task,即存在数据热点。

2、容易导致数据倾斜的场景

Join/GroupBy/CountDistinct,在存在热点key(例如某个字段存在大量空值)的时候,都会导致一个或少数reduce task处理的数据量远超其他task

3、数据倾斜会引发什么问题

        根据mapreduce架构的原理,会按照key把不同的数据hash到不同的reduce task,当存在数据热点时,就会导致某些reduce task处理的数据量远远超过其他task(几倍乃至数十倍),最终表现为少量reduce task执行长尾,任务整体进度长时间卡在99%或者100%。

4、优化思路

  • 过滤掉不符合预期的热点key;
  • 加入随机因素,打散热点key;
  • 使用map join解决小表关联大表造成的数据倾斜问题

map join是指将做连接的小表全量数据分发到作业的map端进行join,从而避免reduce task产生数据倾斜;

十三、Map/Reduce gc严重

优化思路

  • 加大内存
  • sql中有join和group by操作,可以调整参数缩小内存buffer检查间隔
  • 可以选择关闭GBY的map端优化来争取节约内存hive.map.aggr=false;

十四、map/reduce平均运行时间过长

通常是在输入数据量不大,但是由于计算逻辑复杂导致作业执行时间特别长

优化思路

  • map运行时间过长:加大map并发
  • reduce运行时间过长:加大reduce并发

十五、MapTask过多,调度开销大

当sql的输入数据量太大,导致map task个数特别多,虽然每个task执行时间都不长,但是由于计算资源有限,在资源紧张的时候,一个作业内的多个task只能分批串行执行,导致资源调度开销成为任务执行时间过长的主要因素

优化思路

  • 加大单个map处理的数据量,来减少map task个数
  • 合理设置sql查询的分区范围,尽量避免全表扫描

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

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

相关文章

Linux部署前端Vue项目

Linux部署前端Vue项目 1 部署到tomcat上 1.1 部署Vue项目 打包项目 在命令行终端&#xff0c;输入命令&#xff0c;打包项目&#xff1a; npm run build将生成的dist文件夹下的所有内容复制到tomcat的webapps下 "推荐":在webapps下新建一个文件夹&#xff0c;例…

【互信息驱动:可逆神经网络】

Mutual Information-driven Pan-sharpening &#xff08;互信息驱动的全色锐化&#xff09; 全色锐化的目的是综合纹理丰富的全色图像和多光谱图像的互补信息&#xff0c;生成纹理丰富的多光谱图像。尽管已有的全色锐化方法取得了显著的进步&#xff0c;但它们并没有明确地加…

动态圣诞树-HTML

<!DOCTYPE HTML PUBLIC> <html> <head> <title>圣诞树</title> <meta charset"utf-8" > <style> html, body { width: 100%; height: 100%; margin: 0; padding: 0; border: 0; } div { margin: 0; padding: 0; border: 0…

docker高级篇:实战-自己开发的微服务怎么在docker上面运行?

通过前面的一系列学习,我们已经知道怎么制作dockerfile了。那么,本篇文章,咱们就把自己写的spring boot的demo项目,部署在docker上面。 案例目标: 我们自己开发的微服务怎么在docker上面运行呢? 1:通过IDEA新建一个普通的微服务模块 2:通过dockerfile发布微服务部署…

通过 api 和 keycloak 理解OIDC认证

参考资料 通过Keycloak API理解OAuth2与OpenID Connect 什么是keycloak如何在nodejs中使用它 如何通过 OIDC 协议实现单点登录&#xff1f; https://jwt.io/#encoded-jwt OIDC认证的简单demo 单点登录&#xff08;Single Sign On&#xff09;是目前比较流行的企业业务整合…

cut与分层抽样(Stratified Sampling)

个人觉得&#xff0c; 把分层抽样称为“分类采样”会更贴切一些。通常最基本的采样手段是&#xff1a;随机抽样&#xff0c;但是在很多场景下&#xff0c;随机抽样是有问题的&#xff0c;举一个简单的例子&#xff1a;如果现在要发起一个啤酒品牌知名度的调查问卷&#xff0c;我…

二、let进阶、const、全部变量与顶层对象

二、let进阶、const、全部变量与顶层对象 一、let进阶 let创建了块级作用域&#xff0c;每次循环时内部的块级作用域都会去访问外层块级作用域中的变量i&#xff0c;而外层块级作用域中的变量i都不同&#xff0c;所以打印0-9&#xff1b;类似于闭包&#xff1a;内部函数返回到…

MySQL【Primary key】主键约束

关键字: [ primary key ] 作用&#xff1a;用来唯一标识表中的一行记录 特点&#xff1a;1.唯一性约束非空约束 唯一且为空 唯一性约束&#xff1a;不允许出现重复值 非空约束&#xff1a;不允许出现空值&#xff0c;但不是 NULL 2.一个表最多只能有一个主键约束&#x…

35岁之后软件测试工程师靠什么养家?我还能继续做测试。

35岁真是一个焦虑的年龄&#xff0c;我一个在北京软件测试的朋友从一个大公司裸辞以后&#xff0c;年前应聘到了一家小公司做技术总监&#xff0c;因为疫情的爆发&#xff0c;公司倒闭了&#xff0c;他失业了。为了养家我这个朋友不得不冒着被病毒感染的危险开始送外卖。作为一…

Springboot整合Liquibase初始化数据库

一、前言 liquibase是一个数据库变更的版本控制工具。项目中通过liquibase解析用户编写的liquibase的配置文件,生成sql语句&#xff0c;并执行和记录。执行是根据记录确定sql语句是否曾经执行过&#xff0c;和配置文件里的预判断语句确定sql是否执行。 本篇文章给大家介绍spr…

RabbitMQ浏览器UI插件

Awesome RabbitMQ Management 该插件中文意思是"很棒的 RabbitMQ 管理",是对原生RabbitMQ的UI图形界面进行增强的一款插件。 可在Google Chrome商店中下载安装 概述 原文介绍 Awesome RabbitMQ Management RabbitMQ queues view can become unusable with many qu…

微服务 Spring Boot Mybatis-Plus 整合 EasyPOI 实现 Excel 一对多 导入

文章目录⛄引言一、EasyPOI 实现Excel 的一对多导入 -- 代码实现⛅需求说明⚡核心源码实现二、Easy POI 实现一对多导入 -- 测试三、效果图展示⛵小结⛄引言 Excel导入 是 开发中 很常用的 功能 &#xff0c;本篇讲解 如何使用 Spring Boot MyBatis -Plus 整合 EasyPOI 实现E…

2023年淘宝天猫年货节超级红包哪里领?

2023年淘宝天猫年货节超级红包哪里领? 姐妹们在淘宝年货节活动就就就要开始预热模式了&#xff0c;时间是12月27日中午12点&#xff0c;大家最爱的项目一定是领取超级红包了。这不&#xff0c;2023年的年货节就要开启了。但是&#xff0c;很多小伙伴还不知道&#xff0c;淘宝…

<生产者、消费者问题>——《Linux》

目录 1. 生产者消费者模型 1.1 为何要使用生产者消费者模型 1.2 生产者消费者模型优点 2.基于BlockingQueue的生产者消费者模型 2.1 BlockingQueue 2.2 C queue模拟阻塞队列的生产消费模型 3.POSIX信号量 4.基于环形队列的生产消费模型 后记&#xff1a;●由于作者水平…

windows中docker修改镜像与容器存放目录(不想放c盘)

查看状态 wsl --list -v 先退出docker deskop 查看状态 wsl --list -v 关闭wsl wsl --shutdown docker的镜像与容器存放目录在此处 新建一个你想要存放的目录&#xff0c;比如我存到H盘这个地方 分别将c盘那两个文件夹&#xff08;data和distro&#xff09;的内容打包压缩到H盘…

php使用redis进行消息发布订阅

php使用redis进行消息发布订阅前置条件消费者订阅subscribe.php生产者发送消息publish.php执行消费者订阅&#xff0c;开始阻塞获取消息执行生产者&#xff0c;开始发送消息查看消费者终端前置条件 已经安装了php的redis扩展 消费者订阅subscribe.php <?php ini_set(def…

【Java基础】Java日志—什么是日志?什么是Log4j?Log4j入门案例及配置

目录 一、什么是日志&#xff1f; 二、为什么会有日志&#xff1f; 四、入门案例&#xff1a;Log4j日志信息输出到控制台 步骤与实现&#xff1a; 步骤1&#xff1a;拷贝坐标 步骤2&#xff1a;拷贝配置文件 log4j.properties 步骤3&#xff1a;编写测试类 写到最后 &…

TensorRt(3)mnist示例中的C++ API

目前sample中mnist提供了至少caffe、onnx的预训练模型&#xff0c;在TensorRT经过优化生成engine后再进行infer&#xff0c;两种模型的加载处理略有不同&#xff0c;做出简单api处理说明。 最后尝试使用最少的代码来实现整个流程。 文章目录1、主要的C API 定义2、minst示例2.1…

云安全类型及预防方法

恶意软件是我们必须面对的现实&#xff0c;我们每天都需要与蠕虫、病毒、间谍软件和其他行恶意软件作斗争&#xff0c;而云恶意软件是我们需要面对的又一种类别。它已经发展十多年&#xff0c;早在2011年就托管在亚马逊简单存储服务存储桶中。云安全提供商Netskope报告称&#…

springboot够用就好系列-2.基于commandfast框架的应用开发

参考web的jsoncat框架&#xff0c;实现一个控制台IO的commandfast简易框架&#xff0c;并进行使用。 目录 程序效果 实现过程 样例代码 工程文件 参考资料 程序效果 截图1.查询当前时间和用户&#xff0c;查询磁盘空间 利用commandfast框架&#xff0c;实现的2个简单功能&…