数据ETL岗位实习面经
文章目錄
- 筆試題
- 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博主整理了這一點等以后學習到這里再仔細整理趴。
今天的好文就更新到這里辣,歡迎大家提建議并且交流心得撒,筆芯。
總結
以上是生活随笔為你收集整理的数据ETL岗位实习面经的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上海还有哪些比较好的IB学校?
- 下一篇: android 对短信的操作(伪造信息)