1 概述 问题一览
总体感觉良好,通过面试官的介绍可知这个岗位偏向离线数仓。
1.自我介绍
2.询问了其中一段实习经历
3.讲下你说用过的Linux命令
4.讲下HIVE的内部表和外部表有什么不同
*5.讲下你使用过的Hive函数(好好在复习下多准备几个吧)
*6.请讲下维度建模和范式建模的区别(自上而下,自底而上,关系-实体,事实-维度)
*7.为什么关系型数据库更适合范式建模而数仓适合维度建模
8.讲下数据倾斜
*9.HIVE的分区和分桶(分区是放在不同目录下,分桶是放在不同文件中)
10.什么是Hive-on-mr什么是Hive-on-spark
11.又问了简历的另一段实习经历
*12.复述下你曾经做过的一个数据科学的项目,你做了多少,是不是你一个人做的(这个问题失误在于,没有挑典型项目讲,现在要准备下稿子)
12.这个岗位是实习岗,不会影响你秋招吗
12.经典的反问环节
2 题目总结
2.1 讲下HIVE的内部表和外部表有什么不同
- 未被external修饰的是内部表,被external修饰的为外部表。
- 内部表数据由Hive自身管理,外部表数据由HDFS管理;
- 内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse), 外部表数据的存储位置由自己设置;
- 删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除。
2.2 讲下你使用过的Hive函数
HIVE 常用函数总结https://www.zhihu.com/tardis/zm/art/102502175?source_id=1005
- 向下取整函数: floor
- 指定精度取整函数: round
- 向上取整函数: ceil
- 取随机数函数: rand
- 绝对值函数: abs
- 日期转年函数: year
- 日期转月函数: month
- 日期转天函数: day
2.3 请讲下维度建模和范式建模的区别
2.4 为什么关系型数据库更适合范式建模而数仓适合维度建模
范式建模的优缺点
优点
- 节约存储(尤其是利用数据库进行数仓建设的时候)
- 规范化带来的好处是通过减少数据冗余提高更新数据的效率,同时保证数据完整性。
- 结构清晰,易于理解
缺点
- 构建比较复杂
- 查询复杂(需要很多的关联)
- 不适合在大数据环境下构建因为两点:1 查询复杂 2 存储很便宜
**总结:**由于建模方法限定在关系型数据库之上,在某些时候反而限制了整个数据仓库模型的灵活性,性能等,特别是考虑到数据仓库的底层数据向数据集市的数据进行汇总时,需要进行一定的变通才能满足相应的需求。
2.5 讲下数据倾斜
- 空值引发的数据倾斜
解决方案:
第一种:可以直接不让null值参与join操作,即不让null值有shuffle第二种:因为null值参与shuffle时的hash结果是一样的,那么我们可以给null值随机赋值,这样它们的hash结果就不一样,就会进到不同的reduce中 - 不同数据类型引发的数据倾斜
解决方案:
如果key字段既有string类型也有int类型,默认的hash就都会按int类型来分配,那我们直接把int类型都转为string就好了,这样key字段都为string,hash时就按照string类型分配了 - 不可拆分大文件引发的数据倾斜
解决方案:
这种数据倾斜问题没有什么好的解决方案,只能将使用GZIP压缩等不支持文件分割的文件转为bzip和zip等支持文件分割的压缩方式。
所以,我们在对文件进行压缩时,为避免因不可拆分大文件而引发数据读取的倾斜,在数据压缩的时候可以采用bzip2和Zip等支持文件分割的压缩算法。 - 数据膨胀引发的数据倾斜
解决方案:
在Hive中可以通过参数 hive.new.job.grouping.set.cardinality 配置的方式自动控制作业的拆解,该参数默认值是30。表示针对grouping sets/rollups/cubes这类多维聚合的操作,如果最后拆解的键组合大于该值,会启用新的任务去处理大于该值之外的组合。如果在处理数据时,某个分组聚合的列有较大的倾斜,可以适当调小该值。 - 表连接时引发的数据倾斜
解决方案:
通常做法是将倾斜的数据存到分布式缓存中,分发到各个Map任务所在节点。在Map阶段完成join操作,即MapJoin,这避免了 Shuffle,从而避免了数据倾斜。 - 其他情况引发的数据倾斜
解决方案:
这类问题最直接的方式就是调整reduce所执行的内存大小。
调整reduce的内存大小使用mapreduce.reduce.memory.mb这个配置。
2.6 HIVE的分区和分桶的区别
-
分区是按照分区字段在HDFS上建立子文件夹,分区内的数据存放在子文件夹内,查询时不需要全局扫描,只扫描对应分区文件夹的数据。
-
而分桶是按分桶字段对数据取hash值,值相同的放在同一个分桶文件里,分桶生成的是分桶文件,分区对应的是子文件夹。