大数据开发面试的总结-第一篇

大数据开发面试

前言

基于面大数据开发的遇到的一些问题,以及围绕这些问题展开的一些知识点的准备,对大数据开发岗的面试做了一个梳理。努力做一个知识开源的互联网民工,现在阶段还是一个被别人挑选的人,向前进吧。

sql/hql/spark sql/数据仓库 方向

1. spark sql 数据优化中,需要注意哪些方面?

1.使用临时视图减少落到磁盘, 不落到磁盘盘是spark的一个优势,中间步骤 全部用 temporary view 代替临时table ,减少读写hdfs的操作
2.spark下建表 文件格式选择,spark默认为textfile,可根据需求使用squenceFile or ORCFile
3.select 指定字段,代替select *
4.spark其他技术,如broadcast, bucket
5.另外spark sql优化还可通过查看sparkUI找到哪一步耗时最长,针对性优化

2. SparkSql 支持读入的数据类型有哪些?SparkSql 的数据保存语法是什么样的?

SparkSql 支持读入的数据类型有 parquet、csv、json、jdbc、table 和 text 等。 例如选取 DataFrame 中的两列保存到 json 文件中,可指定保存文件的格式 df.select(“name”, “favorite_color”).write.format(“json”).save(“namesAndFavColors.json”)

3. 谈谈 Hive 里分区的概念,它的作用是什么,如何添加和删除分区?

在 Hive 中,表中的一个分区(Partition)对应于表下的一个目录,分区的作用就是辅助查询,缩小查询范围,在 HiveSql 中限制分区条件可加快数据的检索速度。 // 添加分区 ALTER TABLE day_table ADD PARTITION (dt=‘2008-08-08’, hour=‘08’) location ‘/path/pv1.txt’;

4. 如何自定义一个函数供 HiveSql 使用,具体步骤分为哪几步?

Hive使用python编写的自定义函数UDF进行ETL的步骤:
在hive里面加载py文件
add file /usr/local/src/test.py
在HQL中使用TRANSFORM函数动态执行Python文件:
select TRANSFORM(sex) USING ‘python test.py’ as sex from test;

5. HiveSql 使用到的数据跟传统 SQL 数据库中的数据存储方式不同,你能讲解下 HiveSql 中使用到的数据源的数据组织方式吗?
(1) Hive 的数据组织包括数据库、表、视图、分区、分桶和表数据等。数据库,表,分区等等都对应 HDFS 上的一个目录。分桶和表数据对应 HDFS 对应目录下的文件。
(2) Hive 中所有的数据都存储在 HDFS 中,没有专门的数据存储格式,因为 Hive 是读模式 (Schema On Read),可支持 TextFile,SequenceFile,RCFile 或者自定义格式等。
(3)只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。

6. Uninon 跟uninon all 的区别
sql中union和union all区别是,union去重,union all不去重;spark sql中union不去重;

7. 除了distinct外如何使用SQL对数据去重
还可以用group by去重;

8.简述下项目中etl过程
ETL是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程,目的是将企业中的分散、零乱、标准不统一的数据整合到一起,为企业的决策提供分析依据。
(1)数据的抽取(Extract)
  这一部分需要在调研阶段做大量的工作,首先要搞清楚数据是从几个业务系统中来,各个业务系统的数据库服务器运行什么DBMS,是否存在手工数据,手工数据量有多大,是否存在非结构化的数据等等,当收集完这些信息之后才可以进行数据抽取的设计。
  1、对于与存放DW的数据库系统相同的数据源处理方法
  这一类数据源在设计上比较容易。一般情况下,DBMS(SQLServer、Oracle)都会提供数据库链接功能,在DW数据库服务器和原业务系统之间建立直接的链接关系就可以写Select 语句直接访问。
  2、对于与DW数据库系统不同的数据源的处理方法
  对于这一类数据源,一般情况下也可以通过ODBC的方式建立数据库链接——如SQL Server和Oracle之间。如果不能建立数据库链接,可以有两种方式完成,一种是通过工具将源数据导出成.txt或者是.xls文件,然后再将这些源系统文件导入到ODS中。另外一种方法是通过程序接口来完成。
  3、对于文件类型数据源(.txt,.xls),可以培训业务人员利用数据库工具将这些数据导入到指定的数据库,然后从指定的数据库中抽取。或者还可以借助工具实现。
  4、增量更新的问题
  对于数据量大的系统,必须考虑增量抽取。一般情况下,业务系统会记录业务发生的时间,我们可以用来做增量的标志,每次抽取之前首先判断ODS中记录最大的时间,然后根据这个时间去业务系统取大于这个时间所有的记录。利用业务系统的时间戳,一般情况下,业务系统没有或者部分有时间戳。
(2)数据清洗
  数据清洗的任务是过滤那些不符合要求的数据,将过滤的结果交给业务主管部门,确认是否过滤掉还是由业务单位修正之后再进行抽取。
不符合要求的数据主要是有不完整的数据、错误的数据、重复的数据三大类。
  (1)不完整的数据:这一类数据主要是一些应该有的信息缺失,如供应商的名称、分公司的名称、客户的区域信息缺失、业务系统中主表与明细表不能匹配等。对于这一类数据过滤出来,按缺失的内容分别写入不同Excel文件向客户提交,要求在规定的时间内补全。补全后才写入数据仓库。
  (2)错误的数据:这一类错误产生的原因是业务系统不够健全,在接收输入后没有进行判断直接写入后台数据库造成的,比如数值数据输成全角数字字符、字符串数据后面有一个回车操作、日期格式不正确、日期越界等。这一类数据也要分类,对于类似于全角字符、数据前后有不可见字符的问题,只能通过写SQL语句的方式找出来,然后要求客户在业务系统修正之后抽取。日期格式不正确的或者是日期越界的这一类错误会导致ETL运行失败,这一类错误需要去业务系统数据库用SQL的方式挑出来,交给业务主管部门要求限期修正,修正之后再抽取。
  (3)重复的数据:对于这一类数据——特别是维表中会出现这种情况——将重复数据记录的所有字段导出来,让客户确认并整理。
  数据清洗是一个反复的过程,不可能在几天内完成,只有不断的发现问题,解决问题。对于是否过滤,是否修正一般要求客户确认,对于过滤掉的数据,写入Excel文件或者将过滤数据写入数据表,在ETL开发的初期可以每天向业务单位发送过滤数据的邮件,促使他们尽快地修正错误,同时也可以做为将来验证数据的依据。数据清洗需要注意的是不要将有用的数据过滤掉,对于每个过滤规则认真进行验证,并要用户确认。
(3)数据转换
  数据转换的任务主要进行不一致的数据转换、数据粒度的转换,以及一些商务规则的计算。
  (1)不一致数据转换:这个过程是一个整合的过程,将不同业务系统的相同类型的数据统一,比如同一个供应商在结算系统的编码是XX0001,而在CRM中编码是YY0001,这样在抽取过来之后统一转换成一个编码。
  (2)数据粒度的转换:业务系统一般存储非常明细的数据,而数据仓库中数据是用来分析的,不需要非常明细的数据。一般情况下,会将业务系统数据按照数据仓库粒度进行聚合。
  (3)商务规则的计算:不同的企业有不同的业务规则、不同的数据指标,这些指标有的时候不是简单的加加减减就能完成,这个时候需要在ETL中将这些数据指标计算好了之后存储在数据仓库中,以供分析使用。
9. Spark的运行流程
(1)构建Spark Application的运行环境(启动SparkContext),SparkContext向资源管理器(可以是Standalone、Mesos或YARN)注册并申请运行Executor资源;
(2)资源管理器分配Executor资源并启动StandaloneExecutorBackend,Executor运行情况将随着心跳发送到资源管理器上;
(3)SparkContext构建成DAG图,将DAG图分解成Stage,并把Taskset发送给Task Scheduler。Executor向SparkContext申请Task
(4)Task Scheduler将Task发放给Executor运行同时SparkContext将应用程序代码发放给Executor。
(5)Task在Executor上运行,运行完毕释放所有资源。

10 . Sql开窗函数,开窗函数中row_number与rank的区别
row_number是不管重复,都按递增计数;
rank是重复相同的数,序数也为一样;

11.Avg、sum、count 函数,在某列有空值的情况下,结果会有哪些不同
avg空值会忽略,sum空值会忽略;count(*)不会忽略空值,count(col)会忽略只为空的列;count(1)会忽略空值;

12.一个表两个字段,一个id,一个values;values有连续相同;但是有缺失,找出缺失的地方补全(连续缺失的字段如何补全)
暂无答案。

13.数据仓库的基本原理
数据仓库系统是由数据源、集成工具、数据仓库与数据仓库服务器、OLAP服务器、元数据与元数据管理工具、数据集市和前台分析工具等组成。
(1)数据源:
数据源就是提供初始数据的地方,是数据仓库系统的基础。通常包括企业内部数据和外部数据。内部数据包括各种操作型数据库中的数据以及文档数据,外部数据包括各类法律法规、市场信息、竞争对手信息以及各种统计数据和文档。
(2)集成工具:
即ETL工具。ETL是的缩写,包括数据抽取()、数据清洗()、数据转换()、数据加载()等工作。具体地说:
补充:ETL工作是BI/DW项目的核心和灵魂,它按照统一的规则集成并提高数据的价值,是负责完成数据从数据源向目标数据仓库转化的过程,是实施数据仓库的重要步骤。如果说数据仓库的模型设计是一座大厦的设计蓝图,数据是砖瓦的话,那么ETL就是建设大厦的过程。在整个项目中最难部分是用户需求分析和模型设计,而ETL规则设计和实施则是工作量最大的,约占整个项目的60%~80%,这是国内外从众多实践中得到的普遍共识。
(3)数据仓库服务器:
数据仓库服务器负责管理数据仓库中的数据,为整个企业的数据分析提供一个完整的、统一的视图。
(4)OLAP服务器:
使用OLAP服务器对分析需要的数据按照多维数据模型进行再次重组,以支持用户多角度、多层级的数据分析。
(5)数据集市:
数据集市是一个小型的数据仓库,通常具有较少的主题域,是部门级的数据仓库,面向部门级的应用。
(6)前台分析工具:
包括各种数据分析工具,如报表工具、OLAP分析工具、数据挖掘工具。各种分析工具既可以从数据仓库中获取数据,还可以从数据集市中获取数据。
(7)元数据:
元数据就是整个数据仓库的所有描述性信息,即关于数据的数据。ETL负责建立元数据。
总结:数据从数据源到将最终的分析结果呈现给用户,需要经历以下几个过程: ① 从各种数据源中抽取合适的、需要的数据; ② 对数据进行清洗、加工、转换、重构等预处理工作; ③ 建立高效、海量的企业数据仓库(); ④ 针对特定的分析主题,建立专门的数据集市(); ⑤ 针对特定的业务需要,创建前端数据展现应用,或者开展专题分析项目。

数据集市
(1)数据集市的定义:
数据集市就是面向部门或者应用的小型数据仓库,相比企业级数据仓库,具有较少的主题域。
(2)数据集市的分类:
按照数据的获取方式,将数据集市分为从属型数据集市和独立型数据集市。
从属型数据集市就是从中央数据仓库中获取数据,这类数据集市之间是互连的。
独立型数据集市就是直接从操作型数据库等数据源中获取数据,这类数据集市之间没有联系,是相互独立的。
(3)两种建立数据集市的思想:
两种数据集市对应着两种建立数据集市的思想,即“自顶向下”和“自底向上”的思想。
“自顶向下”就是先创建一个中央数据仓库,然后按照各个特定部门的特定需求建立多个从属型的数据集市。
“自底向上”就是先以最少的投资,根据部门的实际需要,创建多个独立的数据集市,然后不断扩充、不断完善,最终形成一个中央数据仓库。
(4)数据集市的作用:
数据集市一般包含着某一特定业务内容的数据,因此可以按照业务的分类来组织,当然也可以按照数据仓库的主题、地理位置、企业部门来组织。这样,数据集市就可以满足企业、部门、个人不同层次、不同范围的人员对数据的需求。
数据集市可以分布在不同的物理平台上,也可以逻辑分布在同一物理平台上。
(5)数据集市与数据仓库的区别:
数据集市是按照部门或者业务分类进行组织的小型数据仓库,而数据仓库则是面向整个企业的。二者的不同,一是主题域的不同,二是数据规模的不同,三是访问效率的不同。

元数据
(1)元数据的定义:
元数据就是关于数据的数据。关系型数据库中的就是元数据的一种。
(2)元数据的作用:
元数据描述数据的结构、来源、抽取和转换规则、存储,描述操纵数据的进程和应用程序的结构、功能等。其主要目的就是提供数据资源的全面指南,使数据仓库管理员和开发人员能够清楚的了解到数据存放在哪里、有什么数据、来源于哪里、如何使用和管理这些数据。
(3)元数据的分类:
按照使用元数据的用户分类,可以分为技术元数据和业务元数据。技术元数据描述数据的技术细节,主要提供给开发人员和管理人员;业务元数据主要是让业务人员能够明白数据仓库中的数据。
按照来源的正式程度分类,分为正式元数据和非正式元数据,前者是经过讨论并由决策者确定的元数据,后者是一些规范、制度、常识组成,没有标准的形式。
按照功能分类,分为数据源元数据、ETL元数据、ODS元数据、DW元数据、报表元数据、接口数据文件格式元数据、商业元数据。

14.星型模型和雪花模型的比较
星型模型因为数据的冗余所以很多统计查询不需要做外部的连接,因此一般情况下效率比雪花型模型要高。
雪花模型使得维度分析更加容易(如果要得到用户的某一指标,还需要做表与表之间的join),比如“针对特定的广告主,有哪些客户或者公司是在线的?”
星形模型用来做指标分析更适合(不需要join,直接就是一张大宽表),比如“给定的一个客户他们的收入是多少?”
雪花模型更少冗余;

15.数据优化中除了用过mapjoin之外,还用过哪些join
第一:在map端产生join
mapJoin的主要意思就是,当链接的两个表是一个比较小的表和一个特别大的表的时候,我们把比较小的table直接放到内存中去,然后再对比较大的表格进行map操作。join就发生在map操作的时候,每当扫描一个大的table中的数据,就要去去查看小表的数据,哪条与之相符,继而进行连接。这里的join并不会涉及reduce操作。map端join的优势就是在于没有shuffle,真好。在实际的应用中,我们这样设置:
set hive.auto.convert.join=true;
这样设置,hive就会自动的识别比较小的表,继而用mapJoin来实现两个表的联合。
第二:common join
common join也叫做shuffle join,reduce join操作。这种情况下生再两个table的大小相当,但是又不是很大的情况下使用的。具体流程就是在map端进行数据的切分,一个block对应一个map操作,然后进行shuffle操作,把对应的block shuffle到reduce端去,再逐个进行联合,这里优势会涉及到数据的倾斜
第三:SMBJoin(首先排序)
smb是sort merge bucket操作,首先进行排序,继而合并,然后放到所对应的bucket中去,bucket是hive中和分区表类似的技术,就是按照key进行hash,相同的hash值都放到相同的buck中去。在进行两个表联合的时候。我们首先进行分桶,在join会大幅度的对性能进行优化。也就是说,在进行联合的时候,是table1中的一小部分和table1中的一小部分进行联合,table联合都是等值连接,相同的key都放到了同一个bucket中去了,那么在联合的时候就会大幅度的减小无关项的扫描。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章