美文网首页
hive面试题

hive面试题

作者: becooner | 来源:发表于2020-03-26 00:21 被阅读0次

    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: 求每个月比较其上月的新增用户量及其留存率(“新增用户”定义为上月未产生购买行为且本月产生了购买行为的用户,“留存用户”定义为上月产生过购买行为且本月也产生了购买行为的人,留存率=本月留存用户数量/上月产生过购买用户数量)。

    相关文章

      网友评论

          本文标题:hive面试题

          本文链接:https://www.haomeiwen.com/subject/zbetuhtx.html