1、hive是什么?
本质是将sql转换成mr程序。
2、hive的架构?
客户端:CLI(shell命令行)、GUI(图形化界面)、jdbc(java实现)
元数据:表名、类型、列分区字段等。可以存储在关系数据库MySQL和自带的derby数据库中。
driver:解析器--》优化器--》执行器
mr:底层计算引擎
hbase/hdfs:存储
3、hive的数据模型?
db:相当于文件夹
table:内部表。在hdfs表现所属db目录下的一个文件夹
external table:外部表
partition:分区
bucket:分桶
4、内部表和外部表的区别
①创建时外部表需要使用external修饰
②内部表数据由hive自身管理,外部表数据由hdfs管理
③删除内部表会将数据一起删除。删除外部表时只会删除元数据和路径信息。
5、hive有哪些数据格式?
textfile:默认格式。数据不做压缩,数据解析开销大。可结合gzip进行使用,但使用该方式,hive不会对数据进行切分。
sequenceFile:是hadoop提供的一种二进制文件格式,支持压缩和切分。一般使用block进行压缩。
ORC:列式存储格式,有多种压缩方式,压缩比高。文件可切分。支持复杂数据结构如map。是以二进制方式存储的。不可直接读取,但是自解析。存储时首先根据行组分割整个表,在每一个行组内按列存储。
parquet:列式存储格式,以二进制方式存储,文件中包含该文件的数据和元数据,可以自解析。存储parquet数据会按照block大小设置行组的大小,由于一般情况下每一个mapper任务处理数据的最小单位是一个block,这样可以把每一个行组由一个mapper热舞处理,增大任务执行并行度。
===在实际项目一般采用orc或者parquet,压缩方式为snappy。
6、hive常用函数?
关系运算:<>、is null、is not null、like、rlike(正则)、regexp(正则)
逻辑运算:%(取余)、&(位与)精度在hive中是很大的问题,类似这样的操作最好通过round指定精度。select round(a%b,2) from dual
数值运算:round(指定精度)、floor(向下取整)、ceil(向上取整)、
日期函数:
from_unixtime(时间戳转日期函数,需要指定格式)select from_unixtime(xxxxxx,yyyyMMdd) from table;
unix_timestamp(日期转时间戳函数)。
datediff : select datediff(enddate,startdate) from table;
date_add:select date_add(date,int) from table
date_sub:
条件函数:if、case、coalesce(返回参数中第一个非空值)
select if(100=200,1,2) from table;1
字符串函数:length、reverse、concat、concat_ws、substring、parse_url、get_json_object、split、regexp_replace、regexp_extract、trim
7、hive优化?
fetch抓取机制、mr的本地模式、join查询优化、数据倾斜优化、了解执行计划explain、严格模式、jvm重用机制
8、描述下fetch的抓取机制
参数设置中,开启为more的时候,在全局查询、limit查询、字段查询都不用走mr程序。
9、mr的本地模式使用场景?
当数据量很小的情况下,如果再触发Hadoop集群的执行,消耗的资源会大于数据在本地执行的情况。所以可以通过配置参数开启。可以设置自动启动的数据量大小,默认为128m。也可以设置输入的文件个数,默认为4个。
10、join的查询优化?如大表join大表?
以前的版本,小表join大表的时候,将小表放在左边,可以有效减少内存溢出发生的机率。
①多个表关联时,最好拆分成小字段,避免大sql,无法控制中间job。
②大表join大表:https://www.cnblogs.com/bjgua/p/9624144.html。先看是否是null值导致表过大。思路1:转换为mapjoin。行列限制。倍数b表,取模join。但该种方法b表都会被膨胀,需要处理的数据变多。思路二:1分为2,将大商家和小商家区分开,新建个膨胀后的大商家表,进行join。都需要建立一个动态变化的大商家表。
11、什么是mapjoin?
如果不指定mapjoin,或者条件不满足mapjoin,那么解析器会将join转换为common join。在reduce端完成join,容易造成数据倾斜。默认开启自动选择mapjoin,表的大小为25m为小表。/*+ MAPJOIN(a) */
12、发生数据倾斜该如何处理?
某个reduce的数据输入量远远高于其他reduce的输入量。
常见于group by、count(distinct)、join等。分为聚合倾斜和join倾斜。设置map端聚合。如果是空值可以进行过滤或者赋予随机值。
13、小文件过多?
小文件产生的地方有三个:map输入端、map输出端、reduce端。解决也分为两种:
输入合并:sethive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;//执行Map前进行小文件合并setmapred.max.split.size=256000000;//每个Map最大输入大小setmapred.min.split.size.per.node=100000000;//一个节点上split的至少的大小 setmapred.min.split.size.per.rack=100000000;//一个交换机下split的至少的大小
输出合并:
set hive.merge.mapfiles=true//在Map-only的任务结束时合并小文件set hive.merge.tezfiles=true;set hive.merge.mapredfiles=true//在Map-Reduce的任务结束时合并小文件set hive.merge.size.per.task=256*1000*1000//合并文件的大小set hive.merge.smallfiles.avgsize=16000000//当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge
14、mysql的存储过程?
存储过程是为了完成指定功能的sql语句集,经编译创建并保存在数据库中,用户可以通过指定的存储过程的名称,传递需要的参数,来调用执行。
15、hql常见面试题
分组topn问题?
使用开窗函数 row_number ,套接子查询判断条件
16、hive的动态和静态分区?
静态分区时通过手动指定,动态分区是通过数据量的判定。静态分区是在编译时期,通过用户的传递来判定,动态分区只有在sql执行时才进行判定。
开启动态分区:set hive.exec.dynamic.partition.mode=true
17、指定分割字段?
row format delimited fields terminated by '\t'
18、jvm重用机制?
有个参数mapred.job.reuse.jvm.num.tasks 默认为1,表示一个jvm上最多顺序执行的task数目。最大可以设置成-1,就是一个job的task数目无论是多少,都可以按照顺序在一个jvm上执行。
题目 2
有如下表结构:
fact_order_detail (订单表)
order_datetime order_id product_id user_id store_id quantity unit_price
dim_product (产品表)
product_id product_name
dim_user (用户表)
user_id user_name city_id
dim_store (店铺表)
store_id store_name city_id
dim_city (城市表)
city_id city_name province_id
dim_province (省份表)
province_id province_name
Q1: 求每个月的每个省份的店铺销售额(单个订单的销售额=quantity * unit_price)。
select month(order_datetime),b.province_name,c.store_name,sum(quantity*unit_price) from dact_order_detail a,dim_province b,dim_store c ,dim_city d where a.store_id=c.store_id and c.city_id=d.city_id and d.province_id=b.province_id group by month(a.order_datetime),b.province_name,c.store_name
Q2: 求每个月的每个产品的销售额及其在当月的销售额占比。
select month(order_datetime) m,product,sum(quantity*unit_price) s,s/(select q from(select month(order_datetime) o,product,sum(quantity*unit_price) q group by o)) from fact_order_detail group by product,m
Q3: 求每个月的销售额及其环比(销售额环比=(本月销售额-上月销售额)/上月销售额)。
select month(order_datetime) m,sum(quantity*unit_price) s,(s-(select sum(quantity*unit_price) s2 from fact_order-details f1 where f1.month=f2.month-1 ))/s2 as 环比 from fact_order_details f2 group by m
Q4: 求每个月比较其上月的新增用户量及其留存率(“新增用户”定义为上月未产生购买行为且本月产生了购买行为的用户,“留存用户”定义为上月产生过购买行为且本月也产生了购买行为的人,留存率=本月留存用户数量/上月产生过购买用户数量)。
网友评论