概述
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,那么会返回所有的行。
最后
以上就是优美荔枝为你收集整理的hive的问题汇总以及问题解析的全部内容,希望文章能够帮你解决hive的问题汇总以及问题解析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复