揭秘hive常见面试题(七)-20道

hive job的优化本地化执行

set hive.exec.mode.local.auto=true;
当一个job满足如下条件的时候才能真正使用本地模式;
1、job的输入数据大小必须小于参数:
hive.exec.mode.local.auto.inputbytes.max(默认128M)
2、job的map数必须小于参数:
hive.exec.mode.local.auto.tasks.max(默认4)
3、job的reduce数量必须是0或者1

hive job的优化job合并输入小文件

在集群中面临这样的问题,集群中很多的小文件,这样会启动很多的(FileInputFormat会将输入文件分割成split。split的个数决定了map的个数),而且这些小文件的执行时间特别短,造成集群的资源没有良好的利用
解决:
set hive.input.format=oar.apache.hadoop.hive.ql.io.CombineHiveInputFormat
这样做后,就会把多个split分片合并成一个。合并的文件数由mapred.max.split.size限制的大小决定

hive job的优化 job合并输出小文件

set hive.merge.smallfiles.avgsize=256000000;当输出文件平均大小小于该值,启动新job合并文件set hive.merge.size.per.task=64000000;设定合并之后的文件大小

hive job的优化JVM重利用

JVM重用可以使得JVM实例在同一个JOB中重新使用N次
set mapred.job.reuse.jvm.num.tasks=10;
JVM重利用对hive的性能有很大的影响,特别是对小文件的场景或者task特别多的场景,可以有效减少执行时间。
当然,这个值不能设置过大,因为有一些job是有reduce任务的。如果reduce任务没有完成,map任务占用的资源不能都饿到释放,这样其他作业就可能处于等待

hive job的优化压缩数据

中间压缩就是处理hive查询的多个job之间的数据
中间压缩,减少网络传输的数据量,中间压缩,不需要压缩效果特别好,选择一个节省CPU耗时的压缩方式
set hive.exec.compress.intermediate=true;
set hive.intermedia.compression.codec=org.apache.hadoop.io.compress.SnappyCode;
set hive.intermedia.compression.type=BLOCK;(按照块进行压缩)
hive查询最终输出的压缩
这个阶段可以选择一个压缩效果比较明显的 , 这样可以降低集群存储的数据量,占用较小的空间
set hive.exec.compress.ouput=true;
set mapred.output.compresssion.codec=org.apache.hadoop.io.compress.GzipCodec;
set hive.intermedia.compression.type=BLOCK;

Hive中的order by,sort by , distribute by , cluster by的区别

Order by
会将所有的数据在一个reducer上执行,得到的结果是整体有序的。但是由于不能并发执行,所以效率比较低。
sort by
排序操作在多个reducer上执行,多以只能保证局部有序。无法保证整体有序
而且,使用sort by 有多个reduce的情况下,可能会造成reduce处理的数据范围可以重叠
distribute by
可以保证每个reduce处理数据范围不重叠。但是不负责排序
cluster by
Cluster by = distribute by + sort by

order by与sort by的区别

a.hive中的ORDER BY语句和关系数据库中的sql语法相似。他会对查询结果做全局排序,这意味着所有的数据会传送到一个Reduce任务上,这样会导致在大数量的情况下,花费大量时间。
b.SORT BY不是全局排序,其在数据进入reducer前完成排序,因此在有多个reduce任务情况下,SORT BY只能保证每个reduce的输出有序,而不能保证全局有序 hive中通过set mapred.reduce.tasks=3;来设定reduce的数量
c.一点小知识:DISTRIBUTE BY可以按指定字段将数据划分到不同的reduce中当DISTRIBUTE BY的字段和SORT BY的字段相同时,可以用CLUSTER BY来代替 DISTRIBUTE BY with SORT BY

Hive 数据块取样

1、按照数据块取样-----根据百分比取样
SELECT * FROM tableA TABLESAMPLE (50 PERCENT);
2、按照数据块取样-----指定取样大小
SELECT * FROM tableA TABLESAMPLE (30M);
3、按照数据块取样-----指定函数取样
这里指定的行数,每个Map中都取样n ROWS
SELECT * FROM tableA TABLESAMPLE (200 ROWS)

Hive 分桶取样

语法:
table_sample: TABLESAMPLE (BUCKET x OUT OF y [ON colname])
其中x是要抽样的桶编号,桶编号从1开始,colname表示抽样的列,y表示桶的数量。
1、假如当前的表没有分过桶
SELECT count(1) FROM tableA TABLESAMPLE (BUCKET 1 OUT OF 10 ON name);
将tableA 中的数据随机分成了10个桶,抽取第一个桶
2、当然,如果试先已经分过桶了,我可以这样做,效率会更高一点
仍然是试先分好了10个桶
正常的执行方式:
SELECT count(1) FROM tableA TABLESAMPLE (BUCKET 1 OUT OF 10 ON name);
但是如果这样执行:
SELECT count(1) FROM tableA TABLESAMPLE (BUCKET 1 OUT OF 20 ON name);
就会在第一个桶里面只抽取一半的数据

分桶和未分桶的抽样区别:

已经分桶的表抽样,查询只会扫描相应桶中的数据;
未分桶表的抽样,查询时候需要扫描整表数据,先分桶,再抽样

insert into 和 override write区别

insert into:将某一张表中的数据写到另一张表中
override write:覆盖之前的内容

hive分区 如何将数据定义到哪一个分区中

Create table logs(ts bigint,line string) Partitioned by (dt string,country string);
Load data local inpath ‘/home/hadoop/par/file01.txt’ into table logs partition (dt=’ 2012-06-02’,country=’cn’);

HIVE 优化?【常考题】

1.输出小文件合并
hive.merge.smallfiles.avgsize 设为5000000
增加map数量,可提高hive运行速度
set mapred.reduce.tasks=10;
2.map join
大小表join时通过使用hint的方式指定join时使用mapjoin。
/+ mapjoin(小表)/
3.hive索引
4.优先过滤数据,减少每个阶段的数据量,对分区表加以分区,同时只选择需要使用的字段
5.根据不同的使用目的优化使用方法
6.尽量原子化操作,尽量避免一个sql包含复杂逻辑
7.join操作小表放在join的左边
8.如果union all的部分个数大于2,或者union部分数据量大,应拆分成多个insert into语句。
1.参数优化,小于6M自动合并
2.加功能,改成分区表,做join写成任务流
3.mapjoin
4.加索引
5.先where 再join
6.加小型的sql

hive有哪些方式保存元数据,各有哪些特点

hive的数据模型包括:database、table、partition和bucket。
1.Database:相当于关系数据库里的命名空间(namespace),它的作用是将用户和数据库的应用隔离到不同的数据库或模式中
2.表(table):hive的表逻辑上由存储的数据和描述表格中的数据形式的相关元数据组成。
Hive里的表友两种类型一种叫托管表,这种表的数据文件存储在hive的数据仓库里,一种叫外部表,这种表的数据文件可以存放在hive数据仓库外部的分布式文件系统上,也可以放到hive数据仓库里(注意:hive的数据仓库也就是hdfs上的一个目录,这个目录是hive数据文件存储的默认路径,它可以在hive的配置文件里进行配置,最终也会存放到元数据库里)。
3.分区(partition):hive里分区的概念是根据“分区列”的值对表的数据进行粗略划分的机制,在hive存储上就体现在表的主目录(hive的表实际显示就是一个文件夹)下的一个子目录,这个文件夹的名字就是我们定义的分区列的名字,没有实际操作经验的人可能会认为分区列是表的某个字段,其实不是这样,分区列不是表里的某个字段,而是独立的列,我们根据这个列存储表的里的数据文件。
4.桶(bucket):上面的table和partition都是目录级别的拆分数据,bucket则是对数据源数据文件本身来拆分数据。

hive与hbase的区别

hive:
1.数据保存在hdfs上,以hdfs格式保存数据,映射为hive中的表结构
2.支持sql语言,调用MR
3.不能做实时操作
4.相对数据量较小
Hbase:
1.Hbase自己的存储机构
2.不支持sql语言,不调用MR
3.可以支持实时操作
4.相对数据量大,对于反复使用的数据比较适用

hive SQL语句中 select from where group by having order by 的执行顺序?

from--where--group by--having--select--order by,
from:需要从哪个数据表检索数据
where:过滤表中数据的条件
group by:如何将上面过滤出的数据分组
having:对上面已经分组的数据进行过滤的条件
select:查看结果集中的哪个列,或列的计算结果
order by :按照什么样的顺序来查看返回的数据

有文件dim_city.txt 如何加载dim_city表中

load data local inpath"./dim_city.txt" insert into table dim_city;

hive如何将下表table_1中的数据

col1 col2 col3
a b 1,2,3
c d 4,5,6
变为:
col1 col2 col 3
a b 1
a b 2
a b 3
c d 4
c d 5
c d 6
create table table_1(col1 string,col2 string,col3 string)
select col1,col2,name from table_1 LATERAL VIEW explode(split(col3,',')) col3 as name;

使用如下示例数据及数据说明情况,分别实现(1)该数据在HIVE库中建表,(2)数据导入到所建表中,(3)使用所建数据表,使用HQL统计2014-12-31账期手机用户上网总流量.数据说明 文件为test.txt字段分割符为|

编写HIVE自定义函数实现ORACLE数据库中的addmonths函数功能,然后封装到HIVE函数库中

addmonths(data a,int b)函数功能简单说明,求传入日期a经过B月后的日期是多少?

Hive的条件判断有几种?

hive 的条件判断(if、coalesce、case)

请适用hive写出查询某网站日志中方位多页面a和页面b的用户数量的语句:

Select count(user) from urla a , urlb b where a.url = b.url ;

你可能感兴趣的:(揭秘hive常见面试题(七)-20道)