大数据面试题

Hive

1. hive的函数

Hive

- hive的函数
	内置函数:
		数学函数:
			取整函数:round(double a) 返回double类型的整数值部分(遵循四舍五入)
			指定精度取整函数:round(double a, int d) 返回指定精度d的double类型
			向下取整函数:floor(double a) 返回等于或者小于该double变量的最大的整数
			向上取整函数:ceil(double a) 返回等于或者大于该double变量的最小的整数
			取随机数函数:rand(),rand(int seed) 返回一个0到1范围内的随机数。如果指定种子seed,则会返回固定的随机数
			幂运算函数:pow(double a, double p) 返回a的p次幂
			绝对值函数:abs(double a)  abs(int a) 返回数值a的绝对值
		字符串函数
			字符串长度函数:length(string A) 返回字符串A的长度
			字符串反转函数:reverse(string A) 返回字符串A的反转结果
			字符串连接函数:concat(string A, string B…) 返回输入字符串连接后的结果,支持任意个输入字符串
			字符串连接函数-带分隔符:concat_ws(string SEP, string A, string B…) 返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符
			字符串截取函数:substr(string A, int start),substring(string A, int start) 返回字符串A从start位置到结尾的字符串
			字符串截取函数:substr(string A, int start, int len),substring(string A, intstart, int len) 返回字符串A从start位置开始,长度为len的字符串
			字符串转大写函数:upper(string A) ucase(string A) 返回字符串A的大写格式
			字符串转小写函数:lower(string A) lcase(string A) 返回字符串A的小写格式
			去空格函数:trim(string A) 去除字符串两边的空格
			左边去空格函数:ltrim(string A) 去除字符串左边的空格
			右边去空格函数:rtrim(string A) 去除字符串右边的空格
			正则表达式替换函数:regexp_replace(string A, string B, string C) 将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。
			URL解析函数:parse_url(string urlString, string partToExtract [, stringkeyToExtract]) 返回URL中指定的部分。partToExtract的有效值为:HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO
			分割字符串函数:split(string str, stringpat) 按照pat字符串分割str,会返回分割后的字符串数组
		日期函数
		条件函数
	表生成函数
	开窗函数
		窗口函数
			NTILE
			ROW_NUMBER:从1开始,按照顺序,生成分组内记录的序列
			RANK:生成数据项在分组中的排名,排名相等会在名次中留下空位(相同时排名值会重复,总数不会变,故相同时排名值会跳跃而不连续)
			DENSE_RANK:生成数据项在分组中的排名,排名相等会在名次中不会留下空位(总数会减少,并且排名值不会跳跃)
		hive 聚合函数
			count()、sum()、avg()、max()、min()
		分析窗口函数 
			LAG:LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)
			LEAD:与LAG相反LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)
			FIRST_VALUE:取分组内排序后,截止到当前行,第一个值
			LAST_VALUE:取分组内排序后,截止到当前行,最后一个值
			特别注意:如果不指定ORDER BY,则进行排序混乱,会出现错误的结果
	自定义函数
		自定义UDF:
			编程步骤:
			(1)继承org.apache.hadoop.hive.ql.UDF
			(2)需要实现evaluate函数;evaluate函数支持重载;
			注意事项:
			(1)UDF必须要有返回类型,可以返回null,但是返回类型不能为void;
			(2)UDF中常用Text/LongWritable等类型,不推荐使用java类型;
		自定义UDTF

- UDF,UDTF,UDAF的区别
	UDF:一进一出
	UDAF:聚集函数,多进一出(类似于:count/max/min)
	UDTF:一进多出;如lateral view explore()

- hive中split、coalease及collect_list函数
	split:字符串切割转化为数组
	coalease:返回参数中第一个非空值,如果所有值都为空,则返回空
	collect_list:列出该字段所有值,不去重

- Hive如何处理小文件的问题
	哪些会产生小文件:
		源数据本身、
		动态分区会产生大量小文件、
		reduce个数越多, 小文件越多、
		按分区插入数据的时候会产生大量的小文件, 文件个数 = maptask个数 * 分区数
	造成的影响:
		小文件会开很多map,一个map开一个JVM去执行,所以这些任务的初始化,启动,执行会浪费大量的资源,严重影响性能
		HDFS存储太多小文件, 会导致namenode元数据特别大, 占用太多内存, 制约了集群的扩展
	解决方法:
		1. 调整参数进行合并(设置map输入/输出、reduce输出等相关参数)
		2. 针对按分区插入数据的时候产生大量的小文件的问题, 可以使用DISTRIBUTE BY rand() 将数据随机分配给Reduce,这样可以使得每个Reduce处理的数据大体一致.
		3. 使用Sequencefile作为表存储格式,不要用textfile,在一定程度上可以减少小文件
		4. 使用hadoop的archive归档
		5. 使用CombineFileInputFormat

- hive数仓分层如何保证每层数据的正确性?
	数据治理

- hive如何结合数据设置压缩和存储格式
	在计算的过程中(DWD、DWM、DWS、APP),为了不影响执行的速度,可以浪费一点磁盘空间,采用orcfile+SNAPPY的方式,提升hive的执行速度。
	DWD明细层根据业务的需要,灵活选用ZLIB或SNAPPY。

- hive底层解析及sparksql底层执行与hive区别,hive数据修改如何实现?
	sparksql底层加了catalyst优化器,
	hive中一般不会去修改数据,常用来分析查询操作,保留历史数据情况下,使用渐变维,拉链表

- 分区表和分桶表如何使用,什么场景
	分区表:用来分区,也就是分文件夹
	分桶表:是分文件,提高查询效率,还有在抽样查询时使用
		桶表的数据加载,由于桶表的数据加载通过hdfs dfs -put文件或者通过load data均不好使,只能通过insert overwrite

- hive表的桶表的数量怎么确定的❌
	位置:列的值做哈希取余 决定数据应该存储到哪个桶
	bucket个数会决定在该表或者该表的分区对应的hdfs目录下生成对应个数的文件,而mapreduce的个数是根据文件块的个数据确定的map个数。

- Hive的优化
	1. Fetch抓取:某些查询不必使用MapReduce计算时,比如在全局查找、字段查找、limit查找等都不走mapreduce
	2. 本地模式:在hive输入数据量非常小时,hive可以通过本地模式在单台机器上处理所有任务
	3. Join优化:
		大小表join:用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理
		大表join大表
			空key过滤
			空key转换:赋一个随机的值
	4. SQL优化:
		列裁剪:只读取查询中所需要用到的列
		分区裁剪:查询的过程中减少不必要的分区
		Group by:可以先在Map端进行部分聚合,最后在Reduce端得出最终结果。参数设置开启map端聚合
		笛卡尔积:尽量避免笛卡尔积,即避免join的时候不加on条件,或者无效的on条件,Hive只能使用1个reducer来完成笛卡尔积。
	5. 动态分区调整:基于查询参数的位置去推断分区的名称,从而建立分区。使用Hive的动态分区,需要进行相应的配置。
		参数设置
		(1)开启动态分区功能(默认true,开启)
		(2)设置为非严格模式
		(3)在所有执行MR的节点上,最大一共可以创建多少个动态分区。
		(4)在每个执行MR的节点上,最大可以创建多少个动态分区。该参数需要根据实际的数据来设定。
		(5)整个MR Job中,最大可以创建多少个HDFS文件。
		(6)当有空分区生成时,是否抛出异常。一般不需要设置。
	6. 调整合适的map数
		增加map数:一个文件大小小于block块(小于128M),但这个文件只有少量字段,却存了几千万条数据,一个map处理肯定非常耗时
		减少map数:当一个任务有很多小文件,文件大小又远远小于block块大小,每个文件都会被当作一个块,用一个map处理,而一个map任务启动和初始化的时间远远大于逻辑处理的时间,就会造成很大的资源浪费
	7. 设置合适的reduce数
		Reduce的个数对整个作业的运行性能有很大影响。如果Reduce设置的过大,那么将会产生很多小文件,对NameNode会产生一定的影响,而且整个作业的运行时间未必会减少;如果Reduce设置的过小,那么单个Reduce处理的数据将会加大,很可能会引起OOM异常。
	8. 并行执行
		设置参数hive.exec.parallel值为true,就可以开启并发执行。Hive会将一个查询转化成一个或者多个阶段。这样的阶段可以是MapReduce阶段、抽样阶段、合并阶段、limit阶段。有些阶段是可以并行执行,这样可能使得整个job的执行时间缩短
	9. 严格模式
		开启严格模式需要修改hive.mapred.mode值为strict,开启严格模式可以禁止3种类型的查询。
			1)对于分区表,在where语句中必须含有分区字段作为过滤条件来限制范围,否则不允许执行。
			2)对于使用了order by语句的查询,要求必须使用limit语句。
			3)限制笛卡尔积的查询。
	10. JVM重用:JVM重用是Hadoop调优参数,JVM重用可以使得JVM实例在同一个job中重新使用N次(特别是对于很难避免小文件的场景或task特别多的场景,这类场景大多数执行时间都很短。)
	11. 推测执行:根据一定的法则推测出“拖后腿”的任务,并为这样的任务启动一个备份任务,让该任务与原始任务同时处理同一份数据,并最终选用最先成功运行完成任务的计算结果作为最终结果。
	12. 存储方式和压缩方式:存储格式压缩格式尤为关键,可以提升计算速度,减少存储空间,降低网络io,磁盘io

- Hive的数据倾斜问题
	原因:
		有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,这是因为某一个key的条数比其他key多很多(有时是百倍或者千倍之多),这条key所在的reduce节点所处理的数据量比其他节点就大很多,从而导致某几个节点迟迟运行不完。
	Hive中会出现数据倾斜的地方:
		join产生的数据倾斜、count(distinct)、group by、一些窗口函数中用了partition by一会造成数据倾斜
	解决方案:
		join产生的数据倾斜:
			大表join小表:小表缓存到内存中
			大表和大表的join:
				其中一张表的多是空值或者0比较多时:异常值赋一个随机值来分散key,均匀分配给多个reduce去执行
				当key值都是有效值时:设置每个节点的reduce处理数据大小
		group by 造成的数据倾斜:配置在map端进行聚合
		count(distinct)以及其他参数不当的数据倾斜:设置适合的reduce个数

- Hive的文件类型和压缩格式
	在计算的过程中(DWD、DWM、DWS、APP),为了不影响执行的速度,可以浪费一点磁盘空间,采用orcfile+SNAPPY的方式,提升hive的执行速度。DWD明细层根据业务的需要,灵活选用ZLIB或SNAPPY。

- sort by、order by、cluster by、distrbute by区别
	order by:全局排序,只有一个reducer
	sort  by:mapreduce内部排序,在进入reduce前完成排序(局部排序)
	distrbute by:分区排序,结合sort by使用,但hive要求distrbute by要写在sort by之前
	cluster by:当distrbute by和sort by字段相同时,可以使用cluster by方式,但是排序方式只能是倒序排序,不能指定排序规则(ASC或DESC)

- null在hive底层如何存储
	用\N 存储

- Hive SQL的执行过程
	1. client提交sql到driver驱动器
	2. 解析器(SQL Parser):将SQL字符转换成抽象语法树AST
	3. 编译器(Physical Plan):将AST编译生成逻辑执行计划
	4. 优化器(Query Optimizer):对逻辑执行计划进行优化
	5. 执行器(Execution):把逻辑执行计划转换成可以运行的物理计划(MR进行计算)

- Hive分区
	是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹
	通过关键字 partitioned by(name string)声明该表是分区表 

- 内部表和外部表的区别?
	在创建内部表时,在时候location指定数据路径时候,会将该路径下的数据移动到该表所在的目录下,于此同时在删除内部表的数据,会删除数据同时也会删除该表所在的元数据,该管理表不适用于其他工具共享数据
	外部表在创建表时候需要添加一个关键子,external,该表不完全管理该表,所以在删除该表,只会删除该表的元数据,不会删除数据,适合与其他工具共享数据
	场景:根据业务,看数据是否需要共享,来创建外部表和内部表


数仓
- OLAP和OLTP的理解
	OLTP:在数据库联机的日常操作,通常对少数记录进行查询、修改。用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题,具有事物性,存储业务数据,为捕获数据
	OLAP:针对某些主题的历史数据进行分析,支持管理决策;存储的一般是历史数据,为分析数据

- 接触过数仓建模不?
	业务建模,生成业务模型,主要解决业务层面的分解和程序化。
	领域建模,生成领域模型,主要是对业务模型进行抽象处理,生成领域概念模型。
	逻辑建模,生成逻辑模型,主要是将领域模型的概念实体以及实体之间的关系进行数据库层次的逻辑化。
	物理建模,生成物理模型,主要解决,逻辑模型针对不同关系型数据库的物理化以及性能等一些具体的技术问题。
	Lambda 架构
		

- 拉链表
	解决缓慢渐变维问题(SCD2),经常在需要保留历史数据时,会使用到

- 大型数仓架构分层
	1.数据运营层ODS:
		(1)存放接入的原始数据(业务数据和日志数据) 
		(2)数据落地到ODS层前,不要做过多的清洗,方便追溯数据;可以通过sparkSQL完成数据清洗ETL后保存到DW层
	2.数据仓库层DW(中间层数据),当业务比较多时,可以细分为: 
		2.1 数据明细层:DWD(Data WareHouse Detail)
			(1)保持和ODS层一样的粒度,不做粒度的上卷和下钻 
			(2)将维度表退化到事实表中,减少两者之间关联,退化指的是将维度表中字段添加到事实表中(拓宽)
			(3)可以将ODS层相同主题的数据汇总在一张表中
			(4)对ODS层数据进行清洗加工处理
		2.2 数据中间层:DWM(Data WareHouse Middle)
			(1)此层不是必要的,可以被DWS层替代
			(2)对DWD层数据按照日期(如天)进行初步的汇总
		2.3 数据服务层:DWS(Data WareHouse Service)
			(1)也叫作数据集市(DM)或者宽表层 
			(2)通常会有以某一个维度为中心,组成跨主题的宽表
				比如 统计一个用户的当日的签到数、收藏数、评论数、抽奖数、订阅数、点赞数、浏 览商品数、添加购物车数、下单数、支付数、退款数、点击广告数组成宽表
			(3)统计多个时间粒度的数据,按天按月等统计
	3.数据应用层APP:
		 (1)又叫做ADS层
		(2)面向业务定制的报表层,复用性不强
		(3)一般存放在ES,MYSQL,Redis来供线上系统使用,或者放在Hive中供数据分析和数据 挖掘使用
	4.维表层 Dimension 
		4.1高基数维度数据:
			(1)指的是数据量很大的维度表,如用户表和商品表 
		4.2低基数维度数据
			(1)指的是数据量较少的维度表,一般是配置表

	注意: 1.数据集市在有些公司并不是指DWS层,整个公司是一个数仓,而一个部门用的数据对应一个数据集市

- ods有哪些数据? 来自哪些系统? 
	最细粒度的事务事实表, 维度表. 
- dws具体做了哪些设计? 满足了一些什么业务? dws怎么划分主题域的? 大概的逻辑是什么样的? 什么逻辑关系? 
- 数仓模型怎么设计的?设计模型的流程?
- 用的是cdh还是apache,为什么

- 数据仓库0-1建设
	1.系统分析,确定主题
		·操作出现的频率,即业务部门每隔多长时间做一次查询分析。
		·在系统中需要保存多久的数据,是一年、两年还是五年、十年。
		·用户查询数据的主要方式,如在时间维度上是按照自然年,还是财政年。
		·用户所能接受的响应时间是多长、是几秒钟,还是几小时。
	2.选择满足数据仓库系统要求的软件平台
		·数据库对大数据量(TB级)的支持能力。
		·数据库是否支持并行操作。
		·能否提供数据仓库的建模工具,是否支持对元数据的管理。
		·能否提供支持大数据量的数据加载、转换、传输工具(ETL)。
		·能否提供完整的决策支持工具集,满足数据仓库中各类用户的需要。
	3.建立数据仓库的逻辑模型
		(1)确定建立数据仓库逻辑模型的基本方法。
		(2)基于主题视图,把主题视图中的数据定义转到逻辑数据模型中。
		(3)识别主题之间的关系。
		(4)分解多对多的关系。
		(5)用范式理论检验逻辑数据模型。
		(6)由用户审核逻辑数据模型。
	4.逻辑数据模型转化为数据仓库数据模型
	具体步骤如下:
		(1)删除非战略性数据:数据仓库模型中不需要包含逻辑数据模型中的全部数据项,某些用于操作处理的数据项要删除。
		(2)增加时间主键:数据仓库中的数据一定是时间的快照,因此必须增加时间主键。
		(3)增加派生数据:对于用户经常需要分析的数据,或者为了提高性能,可以增加派生数据。
		(4)加入不同级别粒度的汇总数据:数据粒度代表数据细化程度,粒度越大,数据的汇总程度越高。粒度是数据仓库设计的一个重要因素,它直接影响到驻留在数据仓库中的数据量和可以执行的查询类型。显然,粒度级别越低,则支持的查询越多;反之,能支持的查询就有限。
	对数据操作的效率与能得到数据的详细程度是一对矛盾,通常,人们希望建成的系统既有较高的效率,又能得到所需的详细资料。实施数据仓库的一个重要原则就是不要试图包括所有详细数据,因为90%的分析需求是在汇总数据上进行的。试图将粒度细化到最低层,只会增加系统的开销,降低系统的性能。
	5.数据仓库数据模型优化
		数据仓库设计时,性能是一项主要考虑因素。在数据仓库建成后,也需要经常对其性能进行监控,并随着需求和数据量的变更进行调整。
		优化数据仓库设计的主要方法是:
			·合并不同的数据表。
			·通过增加汇总表避免数据的动态汇总。
			·通过冗余字段减少表连接的数量,不要超过3~5个。
			·用ID代码而不是描述信息作为键值。
			·对数据表做分区。
	6.数据清洗转换和传输
		由于业务系统所使用的软硬件平台不同,编码方法不同,业务系统中的数据在加载到数据仓库之前,必须进行数据的清洗和转换,保证数据仓库中数据的一致性。
		在设计数据仓库的数据加载方案时,必须考虑以下几项要求:
			·加载方案必须能够支持访问不同的数据库和文件系统。
			·数据的清洗、转换和传输必须满足时间要求,能够在规定的时间范围内完成。
			·支持各种转换方法,各种转换方法可以构成一个工作流。
			·支持增量加载,只把自上一次加载以来变化的数据加载到数据仓库。
	7.开发数据仓库的分析应用
		建立数据仓库的最终目的是为业务部门提供决策支持能力,必须为业务部门选择合适的工具实现其对数据仓库中的数据进行分析的要求。
		信息部门所选择的开发工具必须能够:
			·满足用户的全部分析功能要求。数据仓库中的用户包括了企业中各个业务部门,他们的业务不同,要求的分析功能也不同。如有的用户只是简单的分析报表,有些用户则要求做预测和趋势分析。
			·提供灵活的表现方式。分析的结果必须能够以直观、灵活的方式表现,支持复杂的图表。使用方式上,可以是客户机/服务器方式,也可以是浏览器方式。
		事实上,没有一种工具能够满足数据仓库的全部分析功能需求,一个完整的数据仓库系统的功能可能是由多种工具来实现,因此必须考虑多个工具之间的接口和集成性问题,对于用户来说,希望看到的是一致的界面。

hbase

- hadoop和HBase比较
	hadoop:分布式文件系统HDFS来存储海量数据,并使用 MapReduce 来处理。Hadoop擅长于存储各种格式的庞大的数据,任意的格式甚至非结构化的处理
		缺点:
			Hadoop主要是实现批量数据的处理,并且通过顺序方式访问数据
			要查找数据必须搜索整个数据集, 如果要进行随机读取数据,效率较低
	HBase:
		是建立在HDFS之上,提供高可靠性、高性能、列存储、可伸缩、实时读写
		仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务
		主要用来存储结构化和半结构化的松散数据
		支持的数据类型:byte
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

erainm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值