hive的问题汇总以及问题解析

mac2026-03-29  6

1.Hive内部表与外部表的区别 未被external修饰的是内部表,被external修饰的是外部表 区别: (1)内部表数据由hive自身管理,外部表数据由HDFS管理 (2)内部表数据存储的位置默认是 (/user/hive/warehouse)外部表数据的存储位置由自己指定 (3)删除内部表会直接删除元数据以及存储数据;删除外部表仅仅会删除元数据 HDFS上的文件不会被删除 (4)对外部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)

2.Hive与传统数据库的区别 (1)数据的存储位置 hive是建立在Hadoop之上的,所有的Hive的数据都是存储在HDFS中,而数据库则可以将数据保存在块设备或者本地文件系统中 (2)数据格式。hive中没有定义专门的数据格式,由用户指定,需要指定三个属性:列分隔符,行分隔符,以及读取文件数据的方法, 数据库中,存储引擎定义了自己的数据格式,所有数据都会按照一定的组织存储 (3)数据更新 hive的内容是读多写少的,因此不支持对数据的改写和删除 数据都在加载的时候中确定好的,数据库中的数据通常是需要经常进行修改的 (4)执行延迟 hive在查询数据的时候需要扫描整个表或者分区 因此延迟比较高。只有在处理大数据时才具有优势,数据库在处理小数据是执行延时较低 (5)索引 hive没有 数据库有 (6)执行 hive是MapReduce 数据库是Executor (7)可扩展性 hive高 数据库第 (8)数据规模 hive高 数据库小

3.Hiverc文件

${HIVE_HOME}/bin目录下有个.hiverc文件,它是隐藏文件,启动hive的时候会加载这个文件的内容,常用配置 #在命令行中显示当前数据库名 set hive.cli.print.current.db=true;

#查询出来的结果显示列的名称 set hive.cli.print.header=true;

#启用桶表 set hive.enforce.bucketing=true;

#压缩hive的中间结果 set hive.exec.compress.intermediate=true;

#对map端输出的内容使用BZip2编码/解码器

set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec;

#压缩hive的输出 set hive.exec.compress.output=true;

#对hive中的MR输出内容使用BZip2编码/解码器 set mapred.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec;

#让hive尽量尝试local模式查询而不是mapred方式 set hive.exec.mode.local.auto=true; 4.Hive分区

使用分区技术避免hive全表扫描,提升查询效率 根据业务 通常按照年,月,日,地区等。 使用命令PARTIONED BY(col_name data_type)指定分区 hive的分区字段使用的是表外字段。而mysql使用的是表内字段。

5.Hive分区过多有何坏处以及分区时的注意事项

(1)当分区过多并且数据很大时,可以使用严格模式,避免一个大的MapReduce任务。在严格模式下,当where中没有分区过滤条件时会禁止执行 (2)hive如果有过多的分区,由于底层是存储在HDFS上,HDFS上只用于存储大文件而非小文件,因为过多的分区会增加namenode的负担 (3)hive会转成MapReduce MapReduce会转化成多个task,过多小文件的话,每个文件一个task ,每个task一个jvm实例,JVM的开启与销毁会降低系统效率

6.Hive中复杂数据类型的使用好处与坏处 好处: 由于复杂数据类型的存储数据比基本数据类型要多,在存盘上存储可以连续存储,在查询等操作时可以减少磁盘IO 坏处: 复杂数据类型可能会存在着数据的重复,而且有更大的导致数据不一致的风险

7.hive分桶?

分桶是将数据集分解为更容易管理的若干部分的另一种技术 原理:和MR中的HashPatitioner的原理一模一样 MR中:按照Key的hash值去模reducetask的个数 hive中 按照分桶字段的hash值去模除以分桶的个数

作用: 好处: 方便抽样 提高join查询效率 缺点: 如果通过数据文件load到分区表中,会存在额外的MR负担 实际生产中分桶策略使用频率较低,常见的还是使用数据分区

8.Hive元数据库是用来做什么的,存储哪些信息? 存储表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等 9.为何不使用Derby作为元数据库? (1)每次只有一个内嵌的derby 数据块可以访问数据库,这就意味着一次只能为matastore打开一次hive会话 (2)在使用Derby时,在不同的目录下开始hive会有不停的元数据库 10.Hive什么情况下可以避免进行mapreduce? 简单的查询,就是只是select 不带count,sum,group by这样的,都不走MapReduce 11.Hive MapJoin? 使用场景 select t1.a,t1.b from table t1 join table2 t2 on ( t1.a=t2.a and t1.datecol=20110802) 该语句中B表有30亿行记录,t1表只有100行记录,而且t2表中数据倾斜特别严重,有一个key上有15亿行记录,在运行过程中特别的慢,而且在reduece的过程中遇有内存不够而报错。

关联操作中有一张表非常小 2.不等值的链接操作

MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,而普通的equality join则是类似于mapreduce模型中的file join,需要先分组,然后再reduce端进行连接,使用的时候需要结合着场景;由于mapjoin是在map是进行了join操作,省去了reduce的运行,效率也会高很多

12.Hive的sort by, order by, distribute by, cluster by区别? 一:order by

order by会对输入做全局排序,因此只有一个Reducer(多个Reducer无法保证全局有序),然而只有一个Reducer,会导致当输入规模较大时,消耗较长的计算时间。

二:sort by sort by不是全局排序,其在数据进入reducer前完成排序,因此,如果用sort by进行排序,并且设置mapred.reduce.tasks>1,则sort by只会保证每个reducer的输出有序,并不保证全局有序。sort by不同于order by,它不受hive.mapred.mode属性的影响,sort by的数据只能保证在同一个reduce中的数据可以按指定字段排序。使用sort by你可以指定执行的reduce个数(通过set mapred.reduce.tasks=n来指定),对输出的数据再执行归并排序,即可得到全部结果。

三:distribute by

distribute by是控制在map端如何拆分数据给reduce端的。hive会根据distribute by后面列,对应reduce的个数进行分发,默认是采用hash算法。sort by为每个reduce产生一个排序文件。在有些情况下,你需要控制某个特定行应该到哪个reducer,这通常是为了进行后续的聚集操作。distribute by刚好可以做这件事。因此,distribute by经常和sort by配合使用。

注:Distribute by和sort by的使用场景

1.Map输出的文件大小不均。 2.Reduce输出文件大小不均。 3.小文件过多。 4.文件超大。

四:cluster by

cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是倒叙排序,不能指定排序规则为ASC或者DESC。 12. 数据倾斜整理(转) 原因: (1)key分布不均匀 (2)业务数据本身的特性 (3)建表时考虑不周 (4)某些SQL语句本身就有数据倾斜

优化 1、设置属性来解决 2、join语句的优化 先join在去使用where条件。 3、distinct优化 4、对于关联分桶的方式 两个表以相同方式划分桶,或者两个表的桶个数是倍数关系。(分桶之段为关联字段时)

13.使用Hive如何进行抽样查询? (1)分桶抽样查询 (2)数据块抽样 这种抽样方式不一定适用于所有的文件格式。另外抽样的最小抽样单元是一个HDFS数据块。如果标的数据大小小于普通的块大小128MB,那么会返回所有的行。

最新回复(0)