数据ETL岗位实习面经


给大家分享一下博主近期关于大数据ETL数据实习岗位的一点笔试题和面试题,答案只代表博主的个人见解哈,欢迎大家纠正并且提建议。
在这里插入图片描述

笔试题

1.关于sql优化的五种方式

(1)添加索引

索引是一种特殊的查询表,数据库的搜索引擎可以利用索引来加速对数据检索,索引是唯一的,创建索引时允许单个列或多个列,但是索引也不是没有缺点尼,索引的缺点就是它会减慢数据录入的速度,同时增加数据库的尺寸大小。详细索引可以看博主的以前的文章(MySQL的索引分类)

(2)从表结构上优化sql
  • 分表分库技术(取模分表=水平分割,垂直分割)

    电商项目将一个项目进行分割,拆成多个小项目,每个小项目有自己单独的数据库,互不影响----垂直分割 会员数据库,订单数据库,支付数据库

    分表 根据业务需求,比如存放日志(每年存放)
    水平分割(取模算法:如下图所示)用于均匀的分表…

  • 读写分离 主从复制

  • 尽量将多条Sql压缩到一条Sql语句中,尽量避免过多的执行SQL语句,能够压缩到一句SQL执行的语句不使用用多条来执行。

(3)避免索引失效

单个索引什么时候会失效?
使用like语句查询失效 %使用错误会造成模糊匹配全盘扫描。
组合索引什么时候会失效呢?
1、顺序颠倒时候失效,如where name=value and id = value这是顺序颠倒
2、使用like语句时候失效
3、如果查询时使用id查询索引不失效,使用name查询会失效 如where name=value 索引失效 如where id=value 索引不失效

索引遵循最左原则,也就是说,组合索引是从左往右查询数据的,最左边属性必须有,跳属性就不管用,数据查不到 在使用like语句查询时失效。

在使用了索引后如何判断索引是否生效?

使用explain观察:
1、看key可以看到它有没有用到索引
2、Rows 看看数据到底扫描了多少行
并且不要在素引列上进行操作。

(4)服务器优化

通过判断不同的存储引擎支持的行为来使用合适的存储引擎。

(5)对查询进行优化

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0

3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20

5.in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3

6.下面的查询也将导致全表扫描:
select id from t where name like ‘%abc%’

7.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num/2=100
应改为:
select id from t where num=100*2

8.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)=‘abc’–name以abc开头的id
应改为:
select id from t where name like ‘abc%’
sql部分博主尽力了,有建议欢迎评论
在这里插入图片描述

2.python 用于数据分析常用的库有哪些?

Numpy

Numpy:Numpy可以提供数组支持以及相应的高效处理函数,是SciPy、PandaS等数据处理和科学计算库最基本的函数功能库,Numpy提供了两种基本的对象:ndarray和ufunc。ndarray是存储单一数据类型的多维数组,而ufunc是能够对数组进行处理的函数。

Pandas

Pandas:使用Pandas更容易处理丢失数据。合并MySQL数据库等等,可以用pandas进行数据清洗数据规整,使用时间序列等等,包含Series、DataFrame等高级数据结构。

SciPy

SciPy:专门解决科学计算中各种标准问题域的包的集合,包含的功能有最优化、线性代数、积分、插值、拟合、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算

Matplotlib

Matplotlib:通过控制Matplotlib中的每一个默认属性:图像大小、每英寸点数、线宽、色彩和样式、子图、坐标轴、网个属性、文字和文字属性,来对数据做出可视化操作。

详情可以看博主以前关于巨潮资讯的文章嘎嘎干货!

在这里插入图片描述

3.另外还有一些sql笔试题

这些笔试题博主不一一举例了,都是在csdn和牛客上可以刷的题目,主要需要掌握内外链接左右链接,存储过程,视图等等,每日刷几十道sql题,保证你的sql能力更上一层楼。。。
在这里插入图片描述

面试题

(1)谈一谈你对Java中List和Set以及Map的理解?

一、结构特点
List和Set是存储单列数据的集合,Map是存储键和值这样的双列数据的集合;
List中存储的数据是有顺序,并且允许重复; Map中存储的数据是无序的,其键是不能重复的,但是值是可以重复的;Set中存储的数据是无序的,且不允许有重复,但元素在集合中的位置由元素的hashCode决定,位置是固定的(Set 根据hashcode来进行数据的存储,所以位置是固定的,但是位置不是用户可以控制的,所以对于用户来说 set 中的元素还是无序的);
二、实现类
List接口有三个实现类

LinkedList:基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢;
ArrayList:基于数组实现,非线程安全的,效率高,便于索引,但不便于插入删除;
Vector:基于数组实现,线程安全的,效率低
Map接口有三个实现类

HashMap:基于 hash 表的 Map 接口实现,非线程安全,高效,支持 null 值和 null键; 底层实现:HashMap底层整体结构是一个数组,数组中的每个元素又是一个链表。每次添加一个对象(put)时会产生一个链表对象(Object类型),Map中的每个Entry就是数组中的一个元素(Map.Entry就是一个<Key,Value>),它具有由当前元素指向下一个元素的引用,这就构成了链表。
存储原理:当向HsahMap中添加元素的时候,首先计算Key对象的Hash值,得到数组下标,如果数组该位置为空则插入,否则遍历这个位置链表。当某个节点Key对象和Node对象均和新元素的equals时,用新元素的Value对象替换该节点的Value对象,否则插入新节点。(注意:JDK 8之后加入了红黑树)

HashTable:线程安全,低效,不支持 null 值和 null 键; LinkedHashMap: 是 HashMap 的一个子类,保存了记录的插入顺序;
SortMap 接口: TreeMap,能够把它保存的记录根据键排序,默认是键值的升序排序;
Set接口有两个实现类

HashSet:底层是由 HashMap 实现,不允许集合中有重复的值,使用该方式时需要重写 equals()和 hashCode()方法;
LinkedHashSet:继承与 HashSet,同时又基于 LinkedHashMap 来进行实现,底层使用的是 LinkedHashMap;

三、区别
List 集合中对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,例如通过list.get(i)方法来获取集合中的元素;
Map 中的每一个元素包含一个键和一个值,成对出现,键对象不可以重复,值对象可以重复;
Set 集合中的对象不按照特定的方式排序,并且没有重复对象,但它的实现类能对集合中的对象按照特定的方式排序,例如 TreeSet 类,可以按照默认顺序,也可以通过实现 Java.util.Comparator接口来自定义排序方式。
在这里博主给大家整理了详细的解释(当时面试时候就说一个能重复剩下俩不能重复)
在这里插入图片描述

(2)能否简单说一下yarn的几种调度器?

YARN中支持三种调度器:

1:FIFO Scheduler:先进先出(first in, first out)调度策略

2:Capacity Scheduler:FIFO Scheduler的多队列版本

3:FairScheduler(公平调度器):多队列,多用户共享资源

这里关于调度器博主后期会整理关于yarn和hdfs以及mapreduce三者的基本概念以及流程。其中会包括yarn工作流程和hdfs的读写流程以及mapreduce的工作流程以及mapreduce中的suffle机制。

(3)能否简单说一下redis中的哨兵机制?

监控(Monitoring):我会不断地检查你的Master和Slave是否运作正常。

提醒(Notification):当被监控的某个Redis节点出现问题时, 我可以通过 API 向管理员或者其他应用程序发送通知。

3.自动故障迁移(Automatic failover):当一个Master不能正常工作时,我会开始一次自动故障迁移操作。

我会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master;

当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用现在的Master替换失效Master。

Master和Slave服务器切换后,Master的redis.conf、Slave的redis.conf和sentinel.conf的配置文件的内容都会发生相应的改变,即,Master主服务器的redis.conf配置文件中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换。

详细可以看博主关于redis的主从复制原理里面有详细的解释

(4)简述一下MySQL两种存储引擎的区别?

MySql的两种引擎分辨是MyISAM和InnoDB,在MySql5.1版本之前的默认引擎是MyISAM,而之后的版本默认引擎就是InnoDB。

MyISAM 和InnoDB 讲解
  InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。

两种引擎的特点:MyISAM是表级锁,不支持事务和全文索引,适合一些CMS内容管理系统作为后台数据库使用,但是使用大并发、重负荷生产系统上,表锁结构的特性就显得力不从心。而InnoDB是行级锁,事务安全,支持外键,不支持FULLTEXT类型的索引(5.6.4以后版本开始支持FULLTEXT类型的索引)。InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全存储引擎。InnoDB是为处理巨大量时拥有最大性能而设计的。它的CPU效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。

注意:

InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “a%”。

两种类型最主要的差别就是InnoDB支持事务处理与外键和行级锁。而MyISAM不支持。所以MyISAM往往就容易被人认为只适合在小项目中使用

两种存储引擎在具体的一些实现细节上也会有所不同,比如

* 1.InnoDB 中不保存表的具体行数,也就是说,执行select count() from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含 where条件时,两种表的操作是一样的。

* 2.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

* 3.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

* 4.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

(5)谈谈你对flume的理解?

flume主要博主还没涉及到只能简单叙述一下辣。

Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传 输的系统。Flume 基于流式架构,灵活简单。

无论数据来自什么企业,或是多大量级,通过部署Flume,可以确保数据都安全、及时地到达大数据平台,用户可以将精力集中在如何洞悉数据上。

Flume的定义

Flume支持在日志系统中定制各类数据发送方,用于采集数据;

Flume提供对数据进行简单处理,并写到各种数据接收方的能力。

简单的说,Flume是实时采集日志的数据采集引擎。
Flume有3个重要组件:Source、Channel、Sink

特点:

分布式:flume分布式集群部署,扩展性好
可靠性好: 当节点出现故障时,日志能够被传送到其他节点上而不会丢失
易用性:flume配置使用较繁琐,对使用人员专业技术要求高
实时采集:flume采集流模式进行数据实时采集
适用场景:适用于日志文件实时采集。

其他数据采集工具还有:dataX、kettle、Logstash、Scribe、sqoop。

dataX:

是阿里开源软件异构数据源离线同步工具。实现包括关系型数据库(MySQL、 Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的 数据同步功能。
特点:

易用性:没有界面,以执行脚本方式运行,对使用人员技术要求较高

性能:数据抽取性能高

部署:可独立部署

适用场景:在异构数据库/文件系统之间高速交换数据

kettle

开源ETL工具。支持数据库、FTP、文件、rest接口、hdfs、hive等平台的据进 行抽取、转换、传输等操作,Java编写跨平台,C/S架构,不支持浏览器模式。
特点:
易用性:有可视化设计器进行可视化操作,使用简单

功能强大:不仅能进行数据传输,能同时进行数据清洗转换等操作

支持多种源:支持各种数据库、FTP、文件、rest接口、hdfs、Hive等源

部署方便:独立部署,不依赖第三方产品。

关于flume博主整理了这一点等以后学习到这里再仔细整理趴。

今天的好文就更新到这里辣,欢迎大家提建议并且交流心得撒,笔芯。
在这里插入图片描述

  • 36
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 28
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

红糖番薯

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

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

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

打赏作者

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

抵扣说明:

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

余额充值