百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

数仓/数开面试题真题总结(二)

bigegpt 2024-08-16 14:26 2 浏览

二.Hive

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

2.udf udaf udtf区别

3.hive有哪些保存元数据的方式,各有什么特点。

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

5.生产环境中为什么建议使用外部表?

6.insert into 和 override write区别?

7.hive的判断函数有哪些

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

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

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

11.union all和union的区别

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

13.hive性能优化常用的方法

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

15.order by , sort by , distribute by , cluster by的区别

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

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

18.mapjoin的原理

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

20.hive开发中遇到什么问题?

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

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

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

24.left semi join和left join区别

25.group by为什么要排序

26.说说印象最深的一次优化场景,hive常见的优化思路

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

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

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

30.建好了外部表,用什么语句把数据文件加载到表里

31.Hive的执行流程?

32.hive的元数据信息存储在哪?

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

34.on和where的区别

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

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

二.Hive


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

mapjoin方案

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

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


2.udf udaf udtf区别

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

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

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

简单来说:

UDF:返回对应值,一对一

UDAF:返回聚类值,多对一

UDTF:返回拆分值,一对多


3.hive有哪些保存元数据的方式,个有什么特点。

  • 内存数据库derby,安装小,但是数据存在内存,不稳定
  • mysql数据库,数据存储模式可以自己设置,持久化好,查看方便。


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

Hive内部表外部表区别及各自使用场景


5.生产环境中为什么建议使用外部表?

Hive内部表外部表区别及各自使用场景


6.insert into 和 override write区别?

insert into:将数据写到表中

override write:覆盖之前的内容。


7.hive的判断函数有哪些

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


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

hive主要是做离线分析的

hive建表有三种方式

  • 直接建表法
  • 查询建表法(通过AS 查询语句完成建表:将子查询的结果存在新表里,有数据一般用于中间表)
  • like建表法(会创建结构完全相同的表,但是没有数据)

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


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


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


11.union all和union的区别

union 去重

union oll 不去重


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

Hive调优,数据工程师成神之路


13.hive性能优化常用的方法

Hive调优,数据工程师成神之路

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

delet 删除数据

drop 删除表

truncate 摧毁表结构并重建


15.order by , sort by , distribute by , cluster by的区别

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列进行排序。组内排序


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

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

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


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

分区表:原来的一个大表存储的时候分成不同的数据目录进行存储。如果说是单分区表,那么在表的目录下就只有一级子目录,如果说是多分区表,那么在表的目录下有多少分区就有多少级子目录。不管是单分区表,还是多分区表,在表的目录下,和非最终分区目录下是不能直接存储数据文件的

分桶表:原理和hashpartitioner 一样,将hive中的一张表的数据进行归纳分类的时候,归纳分类规则就是hashpartitioner。(需要指定分桶字段,指定分成多少桶)

分区表和分桶的区别除了存储的格式不同外,最主要的是作用:

  • 分区表:细化数据管理,缩小mapreduce程序 需要扫描的数据量
  • 分桶表:提高join查询的效率,在一份数据会被经常用来做连接查询的时候建立分桶,分桶字段就是连接字段;提高采样的效率

有了分区为什么还要分桶?

(1)获得更高的查询处理效率。同为表加上了额外的结构,Hive在处理有些查询时能利用这个结构。

(2)使取样( sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

分桶是相对分区进行更细粒度的划分。分桶将表或者分区的某列值进行hash值进行区分,如要安装name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。

与分区不同的是,分区依据的不是真实数据表文件中的列,而是我们指定的伪列,但是分桶是依据数据表中真实的列而不是伪列


18.mapjoin的原理

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。

MapJoin简单说就是在Map阶段将小表读入内存,顺序扫描大表完成Join。减少昂贵的shuffle操作及reduce操作
MapJoin分为两个阶段:

通过MapReduce Local Task,将小表读入内存,生成HashTableFiles上传至Distributed Cache中,这里会HashTableFiles进行压缩。

MapReduce Job在Map阶段,每个Mapper从Distributed Cache读取HashTableFiles到内存中,顺序扫描大表,在Map阶段直接进行Join,将数据传递给下一个MapReduce任务。


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


20.hive开发中遇到什么问题?


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

Hive内部表外部表区别及各自使用场景


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<T>, value)

sort_array(Array<T>)

  • 类型转换函数

cast(expr as <type>)

  • 日期函数

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<TYPE> a)

explode(ARRAY)

json_tuple(jsonStr, k1, k2, ...)

parse_url_tuple(url, p1, p2, ...)


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

大厂高频面试题-连续登录问题


24.left semi join和left join区别

left semi join和left join区别


25.group by为什么要排序


26.说说印象最深的一次优化场景,hive常见的优化思路

Hive调优,数据工程师成神之路


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


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


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

大厂高频面试题-连续登录问题


30.建好了外部表,用什么语句把数据文件加载到表里


31.Hive的执行流程?


32.hive的元数据信息存储在哪?


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


34.on和where的区别

left join(on&where)


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

1、写时模式和读时模式

传统数据库是写时模式,在load过程中,提升了查询性能,因为预先解析之后可以对列建立索引,并压缩,但这样也会花费更多的加载时间。

Hive是读时模式,1 oad data非常迅速,因为它不需要读取数据进行解析,仅仅进行文件的复制或者移动。

2、数据格式。Hive中没有定义专门的数据格式,由用户指定,需要指定三个属性:列分隔符,行分隔符,以及读取文件数据的方法。数据库中,存储引擎定义了自己的数据格式。所有数据都会按照一定的组织存储

3、数据更新。Hive的内容是读多写少的,因此,不支持对数据的改写和删除,数据都在加载的时候是确定好的。数据库中的数据通常是需要经常进行修改

4、执行延迟。Hive在查询数据的时候,需要扫描整个表(或分区),因此延迟较高,只有在处理大数据是才有优势。数据库在处理小数据是执行延迟较低。

5、索引。Hive比较弱,不适合实时查询。数据库有。

6、执行。Hive是 Mapreduce,数据库是 Executor

7、可扩展性。Hive高,数据库低

8、数据规模。Hive大,数据库小


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

  • 从本地导入:load data local inpath /home/liuzc into table ods.test
  • 从hdfs导入:load data inpath /user/hive/warehouse/a.txt into ods.test
  • 查询导入:create table tmp_test as select * from ods.test
  • 查询结果导入:insert into table tmp.test select * from ods.test



相关推荐

了解Linux目录,那你就了解了一半的Linux系统

大到公司或者社群再小到个人要利用Linux来开发产品的人实在是多如牛毛,每个人都用自己的标准来配置文件或者设置目录,那么未来的Linux则就是一团乱麻,也对管理造成许多麻烦。后来,就有所谓的FHS(F...

Linux命令,这些操作要注意!(linux命令?)

刚玩Linux的人总觉得自己在演黑客电影,直到手滑输错命令把公司服务器删库,这才发现命令行根本不是随便乱用的,而是“生死簿”。今天直接上干货,告诉你哪些命令用好了封神!喜欢的一键三连,谢谢观众老爷!!...

Linux 命令速查手册:这 30 个高频指令,拯救 90% 的运维小白!

在Linux系统的世界里,命令行是强大的武器。对于运维小白而言,掌握一些高频使用的Linux命令,能极大提升工作效率,轻松应对各种系统管理任务。今天,就为大家奉上精心整理的30个Linu...

linux必学的60个命令(linux必学的20个命令)

以下是Linux必学的20个基础命令:1.cd:切换目录2.ls:列出文件和目录3.mkdir:创建目录4.rm:删除文件或目录5.cp:复制文件或目录6.mv:移动/重命名文件或目录7....

提高工作效率的--Linux常用命令,能够决解95%以上的问题

点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf为什么要学习Linux命令?1、因为Li...

15 个实用 Linux 命令(linux命令用法及举例)

Linux命令行是系统管理员、开发者和技术爱好者的强大工具。掌握实用命令不仅能提高效率,还能解锁Linux系统的无限潜力,本文将深入介绍15个实用Linux命令。ls-列出目录内容l...

Linux 常用命令集合(linux常用命令全集)

系统信息arch显示机器的处理器架构(1)uname-m显示机器的处理器架构(2)uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件-(SMBIOS/DM...

Linux的常用命令就是记不住,怎么办?

1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...

Linux常用文件操作命令(linux常用文件操作命令有哪些)

ls命令在Linux维护工作中,经常使用ls这个命令,这是最基本的命令,来写几条常用的ls命令。先来查看一下使用的ls版本#ls--versionls(GNUcoreutils)8.4...

Linux 常用命令(linux常用命令)

日志排查类操作命令查看日志cat/var/log/messages、tail-fxxx.log搜索关键词grep"error"xxx.log多条件过滤`grep-E&#...

简单粗暴收藏版:Linux常用命令大汇总

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部下午好,我的网工朋友在Linux系统中,命令行界面(CLI)是管理员和开发人员最常用的工具之一。通过命令行,用户可...

「Linux」linux常用基本命令(linux常用基本命令和用法)

Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。总结送免费学习资料(包含视频、技术学习路线图谱、文档等)1、显示日期的指令:d...

Linux的常用命令就是记不住,怎么办?于是推出了这套教程

1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...

Linux的30个常用命令汇总,运维大神必掌握技能!

以下是Linux系统中最常用的30个命令,精简版覆盖日常操作核心需求,适合快速掌握:一、文件/目录操作1.`ls`-列出目录内容`ls-l`(详细信息)|`ls-a`(显示隐藏文件)...

Linux/Unix 系统中非常常用的命令

Linux/Unix系统中非常常用的命令,它们是进行文件操作、文本处理、权限管理等任务的基础。下面是对这些命令的简要说明:**文件操作类:*****`ls`(list):**列出目录内容,显...