大数据面试总结(一)

1. 列式存储和行式存储的区别,各自的优点是什么?

答:传统的行存储在没有列索引的情况下,会把一行全部查出来,查询会使用大量IO,适合针对行操作。列式存储: 每一列单独存放,数据即是索引。

 

2. RDD是什么?再说说RDD dataframe dataset的区别

答:官方介绍,是弹性分布式数据集。 RDD是只读的、分区记录的集合。概念不是很重要,但是要理解RDD的三个特性,即分区,不可变,并行操作。

RDD是分布式的Java对象的集合。DataFrame是分布式的Row对象的集合。DataFrame比RDD多了schema,能看到数据的结构信息。DataFrame除了提供了比RDD更丰富的算子以外,更重要的特点是提升执行效率、减少数据读取以及执行计划的优化,比如filter下推、裁剪等。Dataset可以认为是DataFrame的一个特例,主要区别是Dataset每一个record存储的是一个强类型值而不是一个Row,因此DataSet可以在编译时检查类型,并且是面向对象的编程接口。DataSet的性能比RDD的要好很多。

【参考资料:https://www.jianshu.com/p/c0181667daa0】

 

3. 谈谈你对parquet的了解

答:Apache Parquet是Hadoop生态圈中一种新型列式存储格式,它可以兼容Hadoop生态圈中大多数计算框架(Hadoop、Spark等),被多种查询引擎支持(Hive、Impala、Drill等),并且它是语言和平台无关的。

格式 存储方式 压缩方式 具体特点
TEXTFILE 按行存储 Gzip,Bzip2  存储空间消耗比较大,并且压缩的text 无法分割和合并 查询的效率最低,可以直接存储,加载数据的速度最高
SEQUENCEFILE 按行存储 NONE,RECORD,BLOCK。Record压缩率低,一般建议使用BLOCK压缩 存储空间消耗最大,压缩的文件可以分割和合并 查询效率高,需要通过text文件转化来加载
RCFILE 按列存储  

存储空间最小,

查询的效率最高 ,

需要通过text文件转化来加载,

加载的速度最低。

压缩快 快速列存取。

读记录尽量涉及到的block最少 

读取需要的列只需要读取每个row group 的头部定义。 

读取全量数据的操作 性能可能比sequencefile没有明显的优势

ORC 按列存储 zlib(default),snappy 压缩快,快速列存取 ,效率比rcfile高,是rcfile的改良版本
PARQUET 按列存储   相对于PRC,Parquet压缩比较低,查询效率较低,不支持update、insert和ACID.但是Parquet支持Impala查询引擎
AVRO 按行存储    

【参考资料:https://www.cnblogs.com/xdlaoliu/p/9978448.html】

 

4. 写过UDF吗?谈谈UDAF和UDTF区别

答:udf:一进一出,udaf:多进一出,聚合函数(min/max/count/),udtf:一进多出,later view explore。

 

5. Hive的元数据保存在哪里

答:元数据(Meta Date),主要记录数据仓库中模型的定义、各层级间的映射关系、监控数据仓库的数据状态及 ETL 的任务运行状态。一般会通过元数据资料库(Metadata Repository)来统一地存储和管理元数据,其主要目的是使数据仓库的设计、部署、操作和管理能达成协同和一致。根据元数据存储的介质不同,分为下面两个版本,其中 derby 属于内嵌模式,无需配置直接可用。实际生产环境中则使用 mysql 来进行元数据的存储。

【参考资料:https://blog.csdn.net/b_oyidyt/article/details/81952479】

 

6. Kylin预计算的数据存在哪里?

答:Kylin目前的数据都存储在HBase当中,因此扫描的过程都在HBase中进行。对于每个region,kylin都会启动一个线程来向HBase发送扫描请求,然后将所有扫描的结果返回,聚合之后再返回上一层。为了加快扫描效率,Kylin还使用了HBase的coprocessor来对每个region的扫描结果进行预聚合。

【参考资料:https://www.cnblogs.com/163yun/p/9722586.html】

 

7. Hive去重的方式

答:1.distinct,2.group by,3.row_number()

举例:row_number() over(PARTITION BY tel ORDER BY tel DESC) = 1

 

8. 行转列,列转行的方法

答:行转列,将一个融合多个信息的字段拆分为多行。实现方法:利用内置UDTF函数explode实现。

aaa,bbb,ccc  ===>  aaa
                                bbb
                                ccc

列转行,将多行数据融合为一行。实现方法:concat_ws和collect_set等的结合使用。

aaa   ===>   aaa,bbb,ccc
bbb
ccc

【参考:https://blog.csdn.net/zuiziyoudexiao/article/details/106967856】

 

9:一个字段类型为int,里面有null值,sum之后的结果是什么

答:Hive对有null值的字段为int类型的列求和,会过滤null值进行求和。

select avg(col1) avg_num, sum(col1) sum_num, count(1) cnt, count(col1) cnt_col1
from
(
    select null as col1
    union all
    select 1 as col1
    union all
    select 2 as col1
) a
>>> 1.5    3    3    2

【参考:https://www.cnblogs.com/damahuhu/p/12009182.html】 

 

10. Lead和lag哪个是向上偏移

答:LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值。第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)

LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值。

【参考:https://www.cnblogs.com/qingyunzong/p/8798606.html】

 

11. Hive对json串的处理

答:常用get_json_object进行处理,在非规范的json格式的时候,也常用正则来提取需要的数据。

 

12. Hive表的分区数过多有什么影响?

答:1.当分区过多且数据很大时,可以使用严格模式,避免出发一个大的mapreduce任务。当分区数量过多且数据量较大时,执行宽范围的数据扫描会触发一个很大的mapreduce任务。在严格模式下,当where中没有分区过滤条件时会禁止执行。

2.hive如果有过多的分区,由于底层是存储在HDFS上,HDFS上只用于存储大文件 而非小文件,因为过多的分区会增加namenode的负担。

3.hive会转化为mapreduce,mapreduce会转化为多个task。过多小文件的话,每个文件一个task,每个task一个JVM实例,JVM的开启与销毁会降低系统效率。

【参考:http://www.atguigu.com/jsfx/12340.html】

 

13. Hive内部表和外部表有什么区别?

答:未被external修饰的是内部表(managed table),被external修饰的为外部表(external table);
区别:
内部表数据由Hive自身管理,外部表数据由HDFS管理;
内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定;
删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;
对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)

【参考:https://blog.csdn.net/qq_44449767/article/details/99716613】

 

14. 误删Hive表了要怎么办

答:如果是内部表,删除表的时候底层实际做的是将存储表的数据文件移动到.Trash/Current目录下,将表的元数据信息删除了。通过【sh hadoop fs -lsr 文件目录】找到文件所在位置,把它mv到指定的位置。然后重新建一张和删除的表结构一模一样的表。如果不是分区表现在就可以通过sql查看数据了,如果是分区表的话还需要进行修复分区的操作:MSCK REPAIR TABLE table_name; 如果是外部表,则创建以前的表结构,并且用命令MSCK REPAIR TABLE table_name恢复数据。

【参考:https://blog.csdn.net/weixin_42821133/article/details/106203189】

 

15. Sort by 和order by的区别

答:order by 是全局排序,默认为升序asc ,因此只有一个reducer,只有一个reduce task的结果。如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit来限制输出条数。

sort by 是局部排序,其在数据进入reducer前完成排序。因此,如果用sort by 进行排序,并且设置mapred.reduce.tasks>1,
则sort by 只保证每个reducer的输出有序,不保证全局排序。但是当reducetask的个数为1的话和order by 的排序结果一致。

distribute by 是根据指定的字段将数据分到不同的reducer,且分发算法是hash散列。类似于分桶的概念 按照指定的distribute by 字段和 设置的reducetask的个数进行取余分组,但是并没有排序,只是分,没有排序。

cluster by 除了具有distribute by 的功能外,还会对该字段进行排序。cluster by = distribute by+sort by

【参考:https://www.cnblogs.com/dcx-1993/p/11041228.html】

 

16. Python是怎么和Linux系统交互的

答:利用subprocess模块进行交互。subprocess.Popen,Popen.communicate等方法来实现。

 

17. Hive跑完了,进度条卡在那边不动了,是什么原因?

答:(问题有点模糊)yarn日志里面,process进度条为100%,但是mr过程还没有结束,此时有可能还在传输写数据。

 

18. Hive调优方法

答:

1. 产品经理-->数据产品经理-->数据开发。

数仓规范:表命名规范、任务命名规范、代码开发规范等。

 

22. dm层表一般存储什么数据

答:又称数据集市层DM(date market),基于DW上的基础数据,整合汇总成分析某一个主题域的服务数据,一般是宽表,用于提供后续的业务查询,OLAP分析,数据分发等。

【参考:https://www.cnblogs.com/HondaHsu/p/5314176.html】

你可能感兴趣的:(面试)