IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Hive面试题 -> 正文阅读

[大数据]Hive面试题

Hive面试题

1.Hive的架构

image-20210802161940151

2.Hive和数据库比较

Hive 和数据库除了拥有类似的查询语言,再无类似之处。

1)数据存储位置

Hive 存储在 HDFS 。数据库将数据保存在块设备或者本地文件系统中。

2)数据更新

Hive中不建议对数据的改写。而数据库中的数据通常是需要经常进行修改的,

3)执行延迟

Hive 执行延迟较高。数据库的执行延迟较低。当然,这个是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。

4)数据规模

Hive支持很大规模的数据计算;数据库可以支持的数据规模较小。

hive和传统数据库之间的区别

1、写时模式和读时模式
传统数据库是写时模式,在load过程中,提升了査询性能,因为预先解析之后可以对列建立索引,并压缩,但这样也会花费更多的加载时间。
Hive是读时模式,1oad data非常迅速,因为它不需要读取数据进行解析,仅仅进行文件的复制或者移动。
**2、数据格式。**Hive中没有定义专门的数据格式,由用户指定,需要指定三个属性:列分隔符,行分隔符,以及读取文件数据的方法。数据库中,存储引擎定义了自己的数据格式。所有数据都会按照一定的组织存储
**3、数据更新。**Hive的内容是读多写少的,因此,不支持对数据的改写和删除,数据都在加载的时候中确定好的。数据库中的数据通常是需要经常进行修改
**4、执行延迟。**Hive在查询数据的时候,需要扫描整个表(或分区),因此延迟较高,只有在处理大数据是才有优势。数据库在处理小数据是执行延迟较低。
5、索引。Hive比较弱,不适合实时查询。数据库有。
**6、执行。**Hive是 Mapreduce,数据库是 Executor
**7、可扩展性。**Hive高,数据库低
**8、数据规模。**Hive大,数据库小

3.内部表和外部表

1.hive内部表和外部表的区别

内部表:加载数据到hive所在的hdfs目录,删除时,元数据和数据文件都删除

外部表:不加载数据到hive所在的hdfs目录,删除时,只删除表结构。

这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。

2.什么时候使用内部表,什么时候使用外部表

  • 每天采集的ng日志和埋点日志,在存储的时候建议使用外部表,因为日志数据是采集程序实时采集进来的,一旦被误删,恢复起来非常麻烦。而且外部表方便数据的共享。
  • 抽取过来的业务数据,其实用外部表或者内部表问题都不大,就算被误删,恢复起来也是很快的,如果需要对数据内容和元数据进行紧凑的管理, 那还是建议使用内部表
  • 在做统计分析时候用到的中间表,结果表可以使用内部表,因为这些数据不需要共享,使用内部表更为合适。并且很多时候结果分区表我们只需要保留最近3天的数据,用外部表的时候删除分区时无法删除数据。

4.分区分桶的区别,为什么要分区

**分区表:**原来的一个大表存储的时候分成不同的数据目录进行存储。如果说是单分区表,那么在表的目录下就只有一级子目录,如果说是多分区表,那么在表的目录下有多少分区就有多少级子目录。不管是单分区表,还是多分区表,在表的目录下,和非最终分区目录下是不能直接存储数据文件的
**分桶表:**原理和hashpartitioner 一样,将hive中的一张表的数据进行归纳分类的时候,归纳分类规则就是hashpartitioner。(需要指定分桶字段,指定分成多少桶)
分区表和分桶的区别除了存储的格式不同外,最主要的是作用:

  • 分区表:细化数据管理,缩小mapreduce程序 需要扫描的数据量。

  • 分桶表:提高join查询的效率,在一份数据会被经常用来做连接查询的时候建立分桶,分桶字段就是连接字段;提高采样的效率。

有了分区为什么还要分桶?
(1) 获得更高的查询处理效率。桶为表加上了额外的结构,Hive在处理有些查询时能利用这个结构。

(2) 使取样( sampling)更高效。在处理大规模数据集时,在开发和修改査询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。
分桶是相对分区进行更细粒度的划分。分桶将表或者分区的某列值进行hash值进行区分,如要安装name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。
与分区不同的是,分区依据的不是真实数据表文件中的列,而是我们指定的伪列,但是分桶是依据数据表中真实的列而不是伪列

5.四个By区别

1)Sort By:分区内有序;

2)Order By:全局排序,只有一个Reducer;

3)Distrbute By:类似MR中Partition,进行分区,结合sort by使用。

4) Cluster By:当Distribute by和Sorts by字段相同时,可以使用Cluster by方式。Cluster by除了具有Distribute by的功能外还兼具Sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。


1、 order by可以指定desc降序asc升序

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

2、 sort by不是全局排序,其在数据进入 reducer前完成排序,因此,如果用 sort by进行排序并且设置 mapped. reduce. tasks〉1,则 sort by只会保证每个 reducer的输出有序,并不保证全局有序。(全排序实现:先用 sortby保证每个 reducer输出有序,然后在进行 order by归并下前面所有的 reducer输出进行单个 reducer排序,实现全局有序。)

3、 distribute by(重要)

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

4、 cluster by

cluster by具有 distribute by和 sort by的组合功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC

如何实现组内排序或者组内TopN?语法格式

row number(0)OVER( partition by COLI order by CL2desc)rank先对COL1列进行分区,再对COL2列进行排序。组内排序

6.窗口函数

RANK() 排序相同时会重复,总数不会变

DENSE_RANK() 排序相同时会重复,总数会减少

ROW_NUMBER() 会根据顺序计算

1) OVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化

2)CURRENT ROW:当前行

3)n PRECEDING:往前n行数据

4) n FOLLOWING:往后n行数据

5)UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED FOLLOWING表示到后面的终点

6) LAG(col,n):往前第n行数据

7)LEAD(col,n):往后第n行数据

8) NTILE(n):把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。注意:n必须为int类型。

7.自定义UDF、UDTF

在项目中是否自定义过UDF、UDTF函数,以及用他们处理了什么问题,及自定义步骤?

1)自定义过。

2)用UDF函数解析公共字段;用UDTF函数解析事件字段。

自定义UDF:继承UDF,重写evaluate方法

自定义UDTF:继承自GenericUDTF,重写3个方法:initialize(自定义输出的列名和类型),process(将结果返回forward(result)),close

为什么要自定义UDF/UDTF,因为自定义函数,可以自己埋点Log打印日志,出错或者数据异常,方便调试.

8.udf udaf udtf区别

UDF操作作用于单个数据行,并且产生一个数据行作为输出。大多数函数都属于这一类(比如数学函数和字符串函数)。

UDAF 接受多个输入数据行,并产生一个输出数据行。像COUNT和MAX这样的函数就是聚集函数。

UDTF 操作作用于单个数据行,并且产生多个数据行-------一个表作为输出。lateral view explore()

简单来说:

UDF:返回对应值,一对一

UDAF:返回聚类值,多对一

UDTF:返回拆分值,一对多

9.Hive优化

https://blog.csdn.net/qq_37933018/article/details/106891773(行哥)

(1条消息) 真正让你明白Hive调优系列3:笛卡尔乘积,小表join大表,Mapjoin等问题_涤生手记-CSDN博客

1)MapJoin
如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成Common Join,即:在Reduce阶段完成join。容易发生数据倾斜。可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理。
2)行列过滤
列处理:在SELECT中,只拿需要的列,如果有,尽量使用分区过滤,少用SELECT *。
行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤。
3)采用分桶技术
4)采用分区技术
5)合理设置Map数
(1)通常情况下,作业会通过input的目录产生一个或者多个map任务。
主要的决定因素有:input的文件总个数,input的文件大小,集群设置的文件块大小。
(2)是不是map数越多越好?
答案是否定的。如果一个任务有很多小文件(远远小于块大小128m),则每个小文件也会被当做一个块,用一个map任务来完成,而一个map任务启动和初始化的时间远远大于逻辑处理的时间,就会造成很大的资源浪费。而且,同时可执行的map数是受限的。
(3)是不是保证每个map处理接近128m的文件块,就高枕无忧了?
答案也是不一定。比如有一个127m的文件,正常会用一个map去完成,但这个文件只有一个或者两个小字段,却有几千万的记录,如果map处理的逻辑比较复杂,用一个map任务去做,肯定也比较耗时。
针对上面的问题2和3,我们需要采取两种方式来解决:即减少map数和增加map数;
6)小文件进行合并
在Map执行前合并小文件,减少Map数:CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat没有对小文件合并功能。
7)合理设置Reduce数
Reduce个数并不是越多越好
(1)过多的启动和初始化Reduce也会消耗时间和资源;
(2)另外,有多少个Reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;
在设置Reduce个数的时候也需要考虑这两个原则:处理大数据量利用合适的Reduce数;使单个Reduce任务处理数据量大小要合适;
8)常用参数

// 输出合并小文件
SET hive.merge.mapfiles = true; -- 默认true,在map-only任务结束时合并小文件
SET hive.merge.mapredfiles = true; -- 默认false,在map-reduce任务结束时合并小文件
SET hive.merge.size.per.task = 268435456; -- 默认256M
SET hive.merge.smallfiles.avgsize = 16777216; -- 当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge

10.大表join小表产生的问题,怎么解决?

mapjoin方案

join因为空值导致长尾(key为空值是用随机值代替)

join因为热点值导致长尾,也可以将热点数据和非热点数据分开处理,最后合并

Hive中小表与大表关联(join)的性能分析

https://blog.csdn.net/niuyan666/article/details/118579181

11.hive有哪些保存元数据的方式,分别有什么特点。

Hive Metastore有三种配置方式,分别是:

  1. Embedded Metastore Database (Derby) 内嵌模式
  2. Local Metastore Server 本地元存储
  3. Remote Metastore Server 远程元存储

Metadata、Metastore作用

metadata即元数据。元数据包含用Hive创建的database、tabel等的元信息。
元数据存储在关系型数据库中。如Derby、MySQL等。
Metastore的作用是:客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。

三种配置方式区别

内嵌模式使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastore服务。这个是默认的,配置简单,但是一次只能一个客户端连接,适用于用来实验,不适用于生产环境。
本地元存储和远程元存储都采用外部数据库来存储元数据,目前支持的数据库有:MySQL、Postgres、Oracle、MS SQL Server.在这里我们使用MySQL。
本地元存储和远程元存储的区别是:本地元存储不需要单独起metastore服务,用的是跟hive在同一个进程里的metastore服务。远程元存储需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。远程元存储的metastore服务和hive运行在不同的进程

内存数据库derby,安装小,但是数据存在内存,不稳定

mysql数据库,数据存储模式可以自己设置,持久化好,查看方便。

12.hive的判断函数有哪些

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

13.简单描述一下HIVE的功能?用hive创建表几种方式?hive表有几种?

hive主要是做离线分析的

hive建表有三种方式

  • 直接建表法

  • 查询建表法**(通过AS 查询语句完成建表:将子查询的结果存在新表里,有数据,**一般用于中间表)

  • like建表法(会创建结构完全相同的表,但是没有数据)

hive表有2种:内部表和外部表

14.线上业务每天产生的业务日志(压缩后>=3G),每天需要加载到hive的log表中,将每天产生的业务日志在压缩之后load到hive的log表时,最好使用的压缩算法是哪个,并说明其原因

选择lzo,因为该压缩算法可切分,压缩率比较高,解压缩速度很快,非常适合日志

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R0L3WJIK-1628167496677)(C:/Users/67332/AppData/Roaming/Typora/typora-user-images/image-20210723232108183.png)]

15.若在hive中建立分区仍不能优化查询效率,建表时如何优化

可以重新建表为分区分桶表

16.union all和union的区别

union 去重

union oll 不去重

17.如何解决hive数据倾斜的问题

Hive调优,数据工程师成神之路 (qq.com)

18.简述delete,drop,truncate的区别

delet 删除数据

drop 删除表

truncate 摧毁表结构并重建

19.Hive 里边字段的分隔符用的什么?为什么用\t?有遇到过字段里 边有\t 的情况吗,怎么处理的?为什么不用 Hive 默认的分隔符,默认的分隔符是什么?

hive 默认的字段分隔符为 ascii 码的控制符\001(^A),建表的时候用 fields terminated by ‘\001’

遇到过字段里边有\t 的情况,自定义 InputFormat,替换为其他分隔符再做后续处理

20.mapjoin的原理

image-20210723232806885

MapJoin通常用于一个很小的表和一个大表进行join的场景,具体小表有多小,由参数hive.mapjoin.smalltable.filesize来决定,该参数表示小表的总大小,默认值为25000000字节,即25M。
Hive0.7之前,需要使用hint提示 /*+ mapjoin(table) */才会执行MapJoin,否则执行Common Join,但在0.7版本之后,默认自动会转换Map Join,由参数hive.auto.convert.join来控制,默认为true.
假设a表为一张大表,b为小表,并且hive.auto.convert.join=true,那么Hive在执行时候会自动转化为MapJoin。

image-20210723232826563

21.在hive的row_number中distribute by 和 partition by的区别

row_number() over( partition by 分组的字段 order by 排序的字段) as rank(rank 可随意定义表示排序的标识);
row_number() over( distribute by 分组的字段 sort by 排序的字段) as rank(rank 可随意定义表示排序的标识)
注意:
partition by 只能和order by 组合使用
distribute by 只能和 sort by 使用

22.hive都有哪些函数,你平常工作中用到哪些

  • 数学函数
    round(DOUBLE a)
    floor(DOUBLE a)
    ceil(DOUBLE a)
    rand()

  • 集合函数
    size(Map<K.V>)
    map_keys(Map<K.V>)
    map_values(Map<K.V>)
    array_contains(Array, value)
    sort_array(Array)

  • 类型转换函数
    cast(expr as )

  • 日期函数
    date_format函数(根据格式整理日期)
    date_add、date_sub函数(加减日期)
    next_day函数
    last_day函数(求当月最后一天日期)
    collect_set函数
    get_json_object解析json函数
    from_unixtime(bigint unixtime, string format)
    to_date(string timestamp)
    year(string date)
    month(string date)
    hour(string date)
    weekofyear(string date)
    datediff(string enddate, string startdate)
    add_months(string start_date, int num_months)
    date_format(date/timestamp/string ts, string fmt)

  • 条件函数
    if(boolean testCondition, T valueTrue, T valueFalseOrNull)
    nvl(T value, T default_value)
    COALESCE(T v1, T v2, …)
    CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END
    isnull( a )
    isnotnull ( a )

  • 字符函数
    concat(string|binary A, string|binary B…)
    concat_ws(string SEP, string A, string B…)
    get_json_object(string json_string, string path)
    length(string A)
    lower(string A) lcase(string A)
    parse_url(string urlString, string partToExtract [, string keyToExtract])
    regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT)
    reverse(string A)
    split(string str, string pat)
    substr(string|binary A, int start) substring(string|binary A, int start)

  • 聚合函数
    count sum min max avg

  • 表生成函数
    explode(array a)
    explode(ARRAY)
    json_tuple(jsonStr, k1, k2, …)
    parse_url_tuple(url, p1, p2, …)

23.手写sql,连续活跃用户

大厂高频面试题-连续登录问题 (qq.com)

24.left semi join和left join区别

  • LEFT SEMI JOIN 是 IN/EXISTS 子查询的一种更高效的实现。

  • LEFT SEMI JOIN 的限制是, JOIN 子句中右边的表只能在 ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方都不行。

  • 因为 left semi join 是 in(keySet) 的关系,遇到右表重复记录,左表会跳过,而 join 则会一直遍历。这就导致右表有重复值得情况下 left semi join 只产生一条,join 会产生多条,也会导致 left semi join 的性能更高。

  • left semi join 是只传递表的 join key 给 map 阶段,因此left semi join 中最后 select 的结果只许出现左表。因为右表只有 join key 参与关联计算了,而left join on 默认是整个关系模型都参与计算了

25.聊聊hive的执行引擎,spark和mr的区别?

引擎是mr,基于磁盘进行计算,比较慢

引擎是spark,基于内存进行计算,速度比较快

对于超大数据量的话,hiveOnSpark可能会有内存溢出情况

26.hive的join底层mr是如何实现的?

https://blog.csdn.net/u013668852/article/details/79768266
https://blog.csdn.net/qq_35995514/article/details/105433421

27.sql问题,连续几天活跃的用户?

大厂高频面试题-连续登录问题 (qq.com)

28.Hive的执行流程?

  1. 用户提交查询等任务给Driver。

  2. 编译器获得该用户的任务Plan。

  3. 编译器Compiler根据用户任务去MetaStore中获取需要的Hive的元数据信息。

  4. 编译器Compiler得到元数据信息,对任务进行编译,先将HiveQL转换为抽象语法树,然后将抽象语法树转换成查询块,将查询块转化为逻辑的查询计划,重写逻辑查询计划,将逻辑计划转化为物理的计划(MapReduce), 最后选择最佳的策略。

  5. 将最终的计划提交给Driver。

  6. Driver将计划Plan转交给ExecutionEngine去执行,获取元数据信息,提交给JobTracker或者SourceManager执行该任务,任务会直接读取HDFS中文件进行相应的操作。

  7. 获取执行的结果。

  8. 取得并返回执行结果。

29.sql语句的执行顺序from-where-group by-having -select-order by -limit

from-where-group by-having -select-order by -limit

from-where-group by -(select 后面的语句 上课讲的) -having -select-order by -limit

30.on和where的区别

left join(on&where) (qq.com)

不考虑where条件下,left join 会把左表所有数据查询出来,on及其后面的条件仅仅会影响右表的数据(符合就显示,不符合全部为null)

  • 在匹配阶段,where子句的条件都不会被使用,仅在匹配阶段完成以后,where子句条件才会被使用,它将从匹配阶段产生的数据中检索过滤

  • 所以左连接关注的是左边的主表数据,不应该把on后面的从表中的条件加到where后,这样会影响原有主表中的数据

  • where后面:是先连接然生成临时查询结果,然后再筛选
    on后面:先根据条件过滤筛选,再连接生成临时查询结果

31.hive中导入数据的4种方式

https://blog.csdn.net/niuyan666/article/details/119412890

32. Hive如何将hsql转化成mapreduce任务的

解析器将sql字符串转化成抽象的语法树,遍历语法树生成逻辑执行计划,优化器对执行计划进行优化,然后执行器将优化后的逻辑计划翻译成mapreduce任务。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-06 09:53:50  更:2021-08-06 09:54:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 19:03:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码