数据ETL岗位实习面经
文章目錄
- 筆試題
- 1.關(guān)于sql優(yōu)化的五種方式
- (1)添加索引
- (2)從表結(jié)構(gòu)上優(yōu)化sql
- (3)避免索引失效
- (4)服務(wù)器優(yōu)化
- (5)對查詢進(jìn)行優(yōu)化
- 2.python 用于數(shù)據(jù)分析常用的庫有哪些?
- Numpy
- Pandas
- SciPy
- Matplotlib
- 詳情可以看博主以前關(guān)于巨潮資訊的文章嘎嘎干貨!
- 3.另外還有一些sql筆試題
- 面試題
- (1)談一談你對Java中List和Set以及Map的理解?
- (2)能否簡單說一下yarn的幾種調(diào)度器?
- (3)能否簡單說一下redis中的哨兵機(jī)制?
- (4)簡述一下MySQL兩種存儲引擎的區(qū)別?
- (5)談?wù)勀銓lume的理解?
給大家分享一下博主近期關(guān)于大數(shù)據(jù)ETL數(shù)據(jù)實(shí)習(xí)崗位的一點(diǎn)筆試題和面試題,答案只代表博主的個人見解哈,歡迎大家糾正并且提建議。
筆試題
1.關(guān)于sql優(yōu)化的五種方式
(1)添加索引
索引是一種特殊的查詢表,數(shù)據(jù)庫的搜索引擎可以利用索引來加速對數(shù)據(jù)檢索,索引是唯一的,創(chuàng)建索引時允許單個列或多個列,但是索引也不是沒有缺點(diǎn)尼,索引的缺點(diǎn)就是它會減慢數(shù)據(jù)錄入的速度,同時增加數(shù)據(jù)庫的尺寸大小。詳細(xì)索引可以看博主的以前的文章(MySQL的索引分類)
(2)從表結(jié)構(gòu)上優(yōu)化sql
-
分表分庫技術(shù)(取模分表=水平分割,垂直分割)
電商項(xiàng)目將一個項(xiàng)目進(jìn)行分割,拆成多個小項(xiàng)目,每個小項(xiàng)目有自己單獨(dú)的數(shù)據(jù)庫,互不影響----垂直分割 會員數(shù)據(jù)庫,訂單數(shù)據(jù)庫,支付數(shù)據(jù)庫
分表 根據(jù)業(yè)務(wù)需求,比如存放日志(每年存放)
水平分割(取模算法:如下圖所示)用于均勻的分表… -
讀寫分離 主從復(fù)制
-
盡量將多條Sql壓縮到一條Sql語句中,盡量避免過多的執(zhí)行SQL語句,能夠壓縮到一句SQL執(zhí)行的語句不使用用多條來執(zhí)行。
(3)避免索引失效
單個索引什么時候會失效?
使用like語句查詢失效 %使用錯誤會造成模糊匹配全盤掃描。
組合索引什么時候會失效呢?
1、順序顛倒時候失效,如where name=value and id = value這是順序顛倒
2、使用like語句時候失效
3、如果查詢時使用id查詢索引不失效,使用name查詢會失效 如where name=value 索引失效 如where id=value 索引不失效
索引遵循最左原則,也就是說,組合索引是從左往右查詢數(shù)據(jù)的,最左邊屬性必須有,跳屬性就不管用,數(shù)據(jù)查不到 在使用like語句查詢時失效。
在使用了索引后如何判斷索引是否生效?
使用explain觀察:
1、看key可以看到它有沒有用到索引
2、Rows 看看數(shù)據(jù)到底掃描了多少行
并且不要在素引列上進(jìn)行操作。
(4)服務(wù)器優(yōu)化
通過判斷不同的存儲引擎支持的行為來使用合適的存儲引擎。
(5)對查詢進(jìn)行優(yōu)化
1.對查詢進(jìn)行優(yōu)化,應(yīng)盡量避免全表掃描,首先應(yīng)考慮在 where 及 order by 涉及的列上建立索引。
2.應(yīng)盡量避免在 where 子句中對字段進(jìn)行 null 值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:
select id from t where num is null
可以在num上設(shè)置默認(rèn)值0,確保表中num列沒有null值,然后這樣查詢:
select id from t where num=0
3.應(yīng)盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進(jìn)行全表掃描。
4.應(yīng)盡量避免在 where 子句中使用 or 來連接條件,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:
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 也要慎用,否則會導(dǎo)致全表掃描,如:
select id from t where num in(1,2,3)
對于連續(xù)的數(shù)值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
6.下面的查詢也將導(dǎo)致全表掃描:
select id from t where name like ‘%abc%’
7.應(yīng)盡量避免在 where 子句中對字段進(jìn)行表達(dá)式操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。如:
select id from t where num/2=100
應(yīng)改為:
select id from t where num=100*2
8.應(yīng)盡量避免在where子句中對字段進(jìn)行函數(shù)操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。如:
select id from t where substring(name,1,3)=‘a(chǎn)bc’–name以abc開頭的id
應(yīng)改為:
select id from t where name like ‘a(chǎn)bc%’
sql部分博主盡力了,有建議歡迎評論
2.python 用于數(shù)據(jù)分析常用的庫有哪些?
Numpy
Numpy:Numpy可以提供數(shù)組支持以及相應(yīng)的高效處理函數(shù),是SciPy、PandaS等數(shù)據(jù)處理和科學(xué)計(jì)算庫最基本的函數(shù)功能庫,Numpy提供了兩種基本的對象:ndarray和ufunc。ndarray是存儲單一數(shù)據(jù)類型的多維數(shù)組,而ufunc是能夠?qū)?shù)組進(jìn)行處理的函數(shù)。
Pandas
Pandas:使用Pandas更容易處理丟失數(shù)據(jù)。合并MySQL數(shù)據(jù)庫等等,可以用pandas進(jìn)行數(shù)據(jù)清洗數(shù)據(jù)規(guī)整,使用時間序列等等,包含Series、DataFrame等高級數(shù)據(jù)結(jié)構(gòu)。
SciPy
SciPy:專門解決科學(xué)計(jì)算中各種標(biāo)準(zhǔn)問題域的包的集合,包含的功能有最優(yōu)化、線性代數(shù)、積分、插值、擬合、特殊函數(shù)、快速傅里葉變換、信號處理和圖像處理、常微分方程求解和其他科學(xué)與工程中常用的計(jì)算
Matplotlib
Matplotlib:通過控制Matplotlib中的每一個默認(rèn)屬性:圖像大小、每英寸點(diǎn)數(shù)、線寬、色彩和樣式、子圖、坐標(biāo)軸、網(wǎng)個屬性、文字和文字屬性,來對數(shù)據(jù)做出可視化操作。
詳情可以看博主以前關(guān)于巨潮資訊的文章嘎嘎干貨!
3.另外還有一些sql筆試題
這些筆試題博主不一一舉例了,都是在csdn和牛客上可以刷的題目,主要需要掌握內(nèi)外鏈接左右鏈接,存儲過程,視圖等等,每日刷幾十道sql題,保證你的sql能力更上一層樓。。。
面試題
(1)談一談你對Java中List和Set以及Map的理解?
一、結(jié)構(gòu)特點(diǎn)
List和Set是存儲單列數(shù)據(jù)的集合,Map是存儲鍵和值這樣的雙列數(shù)據(jù)的集合;
List中存儲的數(shù)據(jù)是有順序,并且允許重復(fù); Map中存儲的數(shù)據(jù)是無序的,其鍵是不能重復(fù)的,但是值是可以重復(fù)的;Set中存儲的數(shù)據(jù)是無序的,且不允許有重復(fù),但元素在集合中的位置由元素的hashCode決定,位置是固定的(Set 根據(jù)hashcode來進(jìn)行數(shù)據(jù)的存儲,所以位置是固定的,但是位置不是用戶可以控制的,所以對于用戶來說 set 中的元素還是無序的);
二、實(shí)現(xiàn)類
List接口有三個實(shí)現(xiàn)類
LinkedList:基于鏈表實(shí)現(xiàn),鏈表內(nèi)存是散亂的,每一個元素存儲本身內(nèi)存地址的同時還存儲下一個元素的地址。鏈表增刪快,查找慢;
ArrayList:基于數(shù)組實(shí)現(xiàn),非線程安全的,效率高,便于索引,但不便于插入刪除;
Vector:基于數(shù)組實(shí)現(xiàn),線程安全的,效率低
Map接口有三個實(shí)現(xiàn)類
HashMap:基于 hash 表的 Map 接口實(shí)現(xiàn),非線程安全,高效,支持 null 值和 null鍵; 底層實(shí)現(xiàn):HashMap底層整體結(jié)構(gòu)是一個數(shù)組,數(shù)組中的每個元素又是一個鏈表。每次添加一個對象(put)時會產(chǎn)生一個鏈表對象(Object類型),Map中的每個Entry就是數(shù)組中的一個元素(Map.Entry就是一個<Key,Value>),它具有由當(dāng)前元素指向下一個元素的引用,這就構(gòu)成了鏈表。
存儲原理:當(dāng)向HsahMap中添加元素的時候,首先計(jì)算Key對象的Hash值,得到數(shù)組下標(biāo),如果數(shù)組該位置為空則插入,否則遍歷這個位置鏈表。當(dāng)某個節(jié)點(diǎn)Key對象和Node對象均和新元素的equals時,用新元素的Value對象替換該節(jié)點(diǎn)的Value對象,否則插入新節(jié)點(diǎn)。(注意:JDK 8之后加入了紅黑樹)
HashTable:線程安全,低效,不支持 null 值和 null 鍵; LinkedHashMap: 是 HashMap 的一個子類,保存了記錄的插入順序;
SortMap 接口: TreeMap,能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是鍵值的升序排序;
Set接口有兩個實(shí)現(xiàn)類
HashSet:底層是由 HashMap 實(shí)現(xiàn),不允許集合中有重復(fù)的值,使用該方式時需要重寫 equals()和 hashCode()方法;
LinkedHashSet:繼承與 HashSet,同時又基于 LinkedHashMap 來進(jìn)行實(shí)現(xiàn),底層使用的是 LinkedHashMap;
三、區(qū)別
List 集合中對象按照索引位置排序,可以有重復(fù)對象,允許按照對象在集合中的索引位置檢索對象,例如通過list.get(i)方法來獲取集合中的元素;
Map 中的每一個元素包含一個鍵和一個值,成對出現(xiàn),鍵對象不可以重復(fù),值對象可以重復(fù);
Set 集合中的對象不按照特定的方式排序,并且沒有重復(fù)對象,但它的實(shí)現(xiàn)類能對集合中的對象按照特定的方式排序,例如 TreeSet 類,可以按照默認(rèn)順序,也可以通過實(shí)現(xiàn) Java.util.Comparator接口來自定義排序方式。
在這里博主給大家整理了詳細(xì)的解釋(當(dāng)時面試時候就說一個能重復(fù)剩下倆不能重復(fù))
(2)能否簡單說一下yarn的幾種調(diào)度器?
YARN中支持三種調(diào)度器:
1:FIFO Scheduler:先進(jìn)先出(first in, first out)調(diào)度策略
2:Capacity Scheduler:FIFO Scheduler的多隊(duì)列版本
3:FairScheduler(公平調(diào)度器):多隊(duì)列,多用戶共享資源
這里關(guān)于調(diào)度器博主后期會整理關(guān)于yarn和hdfs以及mapreduce三者的基本概念以及流程。其中會包括yarn工作流程和hdfs的讀寫流程以及mapreduce的工作流程以及mapreduce中的suffle機(jī)制。
(3)能否簡單說一下redis中的哨兵機(jī)制?
監(jiān)控(Monitoring):我會不斷地檢查你的Master和Slave是否運(yùn)作正常。
提醒(Notification):當(dāng)被監(jiān)控的某個Redis節(jié)點(diǎn)出現(xiàn)問題時, 我可以通過 API 向管理員或者其他應(yīng)用程序發(fā)送通知。
3.自動故障遷移(Automatic failover):當(dāng)一個Master不能正常工作時,我會開始一次自動故障遷移操作。
我會將失效Master的其中一個Slave升級為新的Master, 并讓失效Master的其他Slave改為復(fù)制新的Master;
當(dāng)客戶端試圖連接失效的Master時,集群也會向客戶端返回新Master的地址,使得集群可以使用現(xiàn)在的Master替換失效Master。
Master和Slave服務(wù)器切換后,Master的redis.conf、Slave的redis.conf和sentinel.conf的配置文件的內(nèi)容都會發(fā)生相應(yīng)的改變,即,Master主服務(wù)器的redis.conf配置文件中會多一行slaveof的配置,sentinel.conf的監(jiān)控目標(biāo)會隨之調(diào)換。
詳細(xì)可以看博主關(guān)于redis的主從復(fù)制原理里面有詳細(xì)的解釋
(4)簡述一下MySQL兩種存儲引擎的區(qū)別?
MySql的兩種引擎分辨是MyISAM和InnoDB,在MySql5.1版本之前的默認(rèn)引擎是MyISAM,而之后的版本默認(rèn)引擎就是InnoDB。
MyISAM 和InnoDB 講解
InnoDB和MyISAM是許多人在使用MySQL時最常用的兩個表類型,這兩個表類型各有優(yōu)劣,視具體應(yīng)用而定。基本的差別為:MyISAM類型不支持事務(wù)處理等高級處理,而InnoDB類型支持。MyISAM類型的表強(qiáng)調(diào)的是性能,其執(zhí)行數(shù)度比InnoDB類型更快,但是不提供事務(wù)支持,而InnoDB提供事務(wù)支持以及外部鍵等高級數(shù)據(jù)庫功能。
兩種引擎的特點(diǎn):MyISAM是表級鎖,不支持事務(wù)和全文索引,適合一些CMS內(nèi)容管理系統(tǒng)作為后臺數(shù)據(jù)庫使用,但是使用大并發(fā)、重負(fù)荷生產(chǎn)系統(tǒng)上,表鎖結(jié)構(gòu)的特性就顯得力不從心。而InnoDB是行級鎖,事務(wù)安全,支持外鍵,不支持FULLTEXT類型的索引(5.6.4以后版本開始支持FULLTEXT類型的索引)。InnoDB存儲引擎提供了具有提交、回滾和崩潰恢復(fù)能力的事務(wù)安全存儲引擎。InnoDB是為處理巨大量時擁有最大性能而設(shè)計(jì)的。它的CPU效率可能是任何其他基于磁盤的關(guān)系數(shù)據(jù)庫引擎所不能匹敵的。
注意:
InnoDB表的行鎖也不是絕對的,假如在執(zhí)行一個SQL語句時MySQL不能確定要掃描的范圍,InnoDB表同樣會鎖全表,例如update table set num=1 where name like “a%”。
兩種類型最主要的差別就是InnoDB支持事務(wù)處理與外鍵和行級鎖。而MyISAM不支持。所以MyISAM往往就容易被人認(rèn)為只適合在小項(xiàng)目中使用
兩種存儲引擎在具體的一些實(shí)現(xiàn)細(xì)節(jié)上也會有所不同,比如
* 1.InnoDB 中不保存表的具體行數(shù),也就是說,執(zhí)行select count() from table時,InnoDB要掃描一遍整個表來計(jì)算有多少行,但是MyISAM只要簡單的讀出保存好的行數(shù)即可。注意的是,當(dāng)count()語句包含 where條件時,兩種表的操作是一樣的。
* 2.對于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯(lián)合索引。
* 3.DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除。
* 4.LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導(dǎo)入數(shù)據(jù)后再改成InnoDB表,但是對于使用的額外的InnoDB特性(例如外鍵)的表不適用。
(5)談?wù)勀銓lume的理解?
flume主要博主還沒涉及到只能簡單敘述一下辣。
Flume 是 Cloudera 提供的一個高可用的,高可靠的,分布式的海量日志采集、聚合和傳 輸?shù)南到y(tǒng)。Flume 基于流式架構(gòu),靈活簡單。
無論數(shù)據(jù)來自什么企業(yè),或是多大量級,通過部署Flume,可以確保數(shù)據(jù)都安全、及時地到達(dá)大數(shù)據(jù)平臺,用戶可以將精力集中在如何洞悉數(shù)據(jù)上。
Flume的定義
Flume支持在日志系統(tǒng)中定制各類數(shù)據(jù)發(fā)送方,用于采集數(shù)據(jù);
Flume提供對數(shù)據(jù)進(jìn)行簡單處理,并寫到各種數(shù)據(jù)接收方的能力。
簡單的說,Flume是實(shí)時采集日志的數(shù)據(jù)采集引擎。
Flume有3個重要組件:Source、Channel、Sink
特點(diǎn):
分布式:flume分布式集群部署,擴(kuò)展性好
可靠性好: 當(dāng)節(jié)點(diǎn)出現(xiàn)故障時,日志能夠被傳送到其他節(jié)點(diǎn)上而不會丟失
易用性:flume配置使用較繁瑣,對使用人員專業(yè)技術(shù)要求高
實(shí)時采集:flume采集流模式進(jìn)行數(shù)據(jù)實(shí)時采集
適用場景:適用于日志文件實(shí)時采集。
其他數(shù)據(jù)采集工具還有:dataX、kettle、Logstash、Scribe、sqoop。
dataX:
是阿里開源軟件異構(gòu)數(shù)據(jù)源離線同步工具。實(shí)現(xiàn)包括關(guān)系型數(shù)據(jù)庫(MySQL、 Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各種異構(gòu)數(shù)據(jù)源之間穩(wěn)定高效的 數(shù)據(jù)同步功能。
特點(diǎn):
易用性:沒有界面,以執(zhí)行腳本方式運(yùn)行,對使用人員技術(shù)要求較高
性能:數(shù)據(jù)抽取性能高
部署:可獨(dú)立部署
適用場景:在異構(gòu)數(shù)據(jù)庫/文件系統(tǒng)之間高速交換數(shù)據(jù)
kettle
開源ETL工具。支持?jǐn)?shù)據(jù)庫、FTP、文件、rest接口、hdfs、hive等平臺的據(jù)進(jìn) 行抽取、轉(zhuǎn)換、傳輸?shù)炔僮?#xff0c;Java編寫跨平臺,C/S架構(gòu),不支持瀏覽器模式。
特點(diǎn):
易用性:有可視化設(shè)計(jì)器進(jìn)行可視化操作,使用簡單
功能強(qiáng)大:不僅能進(jìn)行數(shù)據(jù)傳輸,能同時進(jìn)行數(shù)據(jù)清洗轉(zhuǎn)換等操作
支持多種源:支持各種數(shù)據(jù)庫、FTP、文件、rest接口、hdfs、Hive等源
部署方便:獨(dú)立部署,不依賴第三方產(chǎn)品。
關(guān)于flume博主整理了這一點(diǎn)等以后學(xué)習(xí)到這里再仔細(xì)整理趴。
今天的好文就更新到這里辣,歡迎大家提建議并且交流心得撒,筆芯。
總結(jié)
以上是生活随笔為你收集整理的数据ETL岗位实习面经的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上海还有哪些比较好的IB学校?
- 下一篇: android 对短信的操作(伪造信息)