文章目录
笔试题
1.关于sql优化的五种方式
(1)添加索引
(2)从表结构上优化sql
(3)避免索引失效
(4)服务器优化
(5)对查询进行优化
2.python 用于数据分析常用的库有哪些?
Numpy
Pandas
SciPy
Matplotlib
详情可以看博主以前关于巨潮资讯的文章嘎嘎干货!
3.另外还有一些sql笔试题
面试题
(1)谈一谈你对Java中List和Set以及Map的理解?
(2)能否简单说一下yarn的几种调度器?
(3)能否简单说一下redis中的哨兵机制?
(4)简述一下MySQL两种存储引擎的区别?
(5)谈谈你对flume的理解?
给大家分享一下博主近期关于大数据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博主整理了这一点等以后学习到这里再仔细整理趴。
今天的好文就更新到这里辣,欢迎大家提建议并且交流心得撒,笔芯。