hive sql數據分析面試整理

原文鏈接:https://www.jianshu.com/p/7bc58aa08185

1.寫作目的說明

hive sql是從事數據分析的同學的基本功。無論是秋招、春招或者是實習,sql都是面試官考察的重點,拿剛剛過去的19秋招來說,搜狐、網易、京東等在數據分析師崗位面試時都考了sql,而拼多多在數據分析筆試時就安排了四到五道複雜的sql題,雖然實習的難度會比秋招要小,可是sql仍然是重頭戲。因此可以說數據分析的敲門磚之一就是sql
在工作中,也有人戲稱數據分析師是sql提數機,也有職場前輩說數據分析師不應該甘心成爲一個提數機,但是在沉澱業務理解之前,快速準確的提數也是數據分析師必經的階段。
下面進入正題

2.hive簡介

hive是基於hadoop構建的一套數據倉庫查詢系統,支持使用sql語句對存儲在hadoop裏面的分佈式文件系統進行分析,將結構化的數據映射成一張表,通過將sql語句轉化成mapreduce任務進行運行,從而實現查詢分析的功能

3.簡單常用函數

其中3.1/3.2/3.3需要了解,3.4的內容是必須掌握

3.1 創建臨時表

CREATE  TABLE IF NOT EXISTS table_name 
  [(col_name data_type [COMMENT col_comment], ...)] 
  [COMMENT table_comment] 
  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
  [STORED AS file_format] 

3.2 刪除新表

DELETE TABLE IF EXISTS table_name;

3.3 插入新字段

ALTER TABLE table_name ADD COLUMNS 
[(col_name data_type [COMMENT col_comment],...)]

3.4 查詢字段

查詢語句是面試中的重頭戲,需要面試者將查詢函數組合在一起實現某個需求,比如給出查詢三班女生數學成績前五名的學生姓名這個問題,應該怎麼分析呢?
在解答上面的問題之前,需要牢記hive sql語句的執行順序,從前到後依次是:

  • from + 表名
  • on +字段
  • (left/right)join +表名
  • where +條件
  • group by +字段
  • having + 條件
  • select +字段
  • distinct +字段
  • union +結果集
  • order by +字段
  • limit +數量
    我的習慣是執行順序就是我思考分析的順序,但是代碼最終的呈現順序和執行順序略有不同,對上面這個問題來說,首先在問題中可以知道最終選出的字段是學生姓名,那麼就明確了select的字段只有一個,就是name
    接着想到執行順序第一個是from,那麼一定有一個表,無論是中間表還是原始表,一定可以接着寫下這樣的語句
FROM scores //假設scores是表名

接着執行順序到了on和join,這時候就要考慮是不是需要連表的問題,假設在這個問題中需要連表,因爲會有一張表basic記錄了全校學生的性別,那麼這時候就需要把score和basic連在一起,接下來就可以這麼寫

FROM scores // 這是之前寫過的
LEFT JOIN basic
ON scores.name = basic.name

接着執行順序到了where,where的限定條件有三個,分別是三班,數學,女生,那麼寫下來就是

FROM scores
LEFT JOIN basic
ON scores.name=basic.name
where scores.class=3 and subject = 'math' and basic.sex = 'female'

接着執行順序到了group by ,having ,這個問題不需要這個函數,那麼接下來執行順序到了select,如之前所說,代碼的書寫順序和執行順序,所以select語句要寫在前面

SELECT scores.name
FROM scores
LEFT JOIN basic
ON scores.name=basic.name
where scores.class=3 and subject = 'math' and basic.sex = 'female'

可是我們並沒有實現前五名的查找,我們目前只是查到了所有人的名字,所以需要根據成績來對名字進行排序,select之後的執行順序是distinct和union這裏我們並不需要,因此要用order by 進行排序

(SELECT scores.name,scores.score // 增加了一個scores.score字段
FROM scores
LEFT JOIN basic
ON scores.name=basic.name
where scores.class=3 and subject = 'math' and basic.sex = 'female'
ORDER BY scores.score desc)a

你會有疑問爲什麼要加上score字段,因爲order by是在select 之後執行,他需要在select出來的那些字段裏進行排序,如果我們沒有加上score,那麼order by就找不到要排序的字段了,因此我們要在a表的基礎上再進行一次select纔可以,只把name字段選擇出來,並且通過limit把前5名選出來,

SELECT a.name
FROM
(SELECT scores.name,scores.score // 增加了一個scores.score字段
FROM scores
LEFT JOIN basic
ON scores.name=basic.name
where scores.class=3 and subject = 'math' and basic.sex = 'female'
ORDER BY scores.score desc)a
LIMIT 5

剛纔的分析問題解答完畢。

4.複雜窗口函數

在sql中有聚合函數,它的作用是把多行數據聚成一行,比如count,sum,avg,max,min就是常見的聚合函數,但是當我們既想要保留聚合前的數據又想要看到聚合後新字段的數據時,就需要用到窗口函數,那麼窗口函數的執行順序是怎樣的呢?窗口函數的執行順序靠後,在order by之前。
窗口函數有以下幾種形式

4.1 普通型

1. 聚合函數+over()
2. 聚合函數+over(partition by ... )
3. 聚合函數+over(partition by ... order by ...)
4. 聚合函數+over(partition by ... order by ...) rows between A and B,A/B

可選擇的如下:

- UNBOUNDED PRECEDING 起點
- UNBOUNDED FOLLOWING 終點
- CURRENT ROW 當前行
- 數字+PRECEDING 前幾行
- 數字+FOLLOWING 後幾行

4.2 排序型

- dense_rank over(partition by ... order by ...)
//eg:1,2,3,3,4 
- rank over(partition by ... order by ...)
//eg:1,2,3,3,5
- row_number over (partition by ... order by ...)
//eg:1,2,3,4,5

4.3 前後型

- lag(colname,num,default) over(partition by ... order by ...) :前幾行
- lead(colname,num,default) over (partition by ... order by ...):後幾行

4.4 分組排序後

- first_value(colname) over(partition by ... order by ...):分組排序後第一行
- last_value(colname) over(partition by ... order by ...):分組排序後最後一行

4.5 切片型

- ntile(3) over() :對全局數據切片
- ntile(3) over(partition by ...):對分組之後的數據切片
- ntile(3) over(order by ...):對數據按照升序後切片
- ntile(3) over(partition by ... order by ...):對數據分組並按照升序後切片

4.6 百分型

1.小於等於當前值的行數/分組內總行數

- CUME_DIST over (order by ...)
- CUME_DIST over (partition by ... order by ...)

2.分組內當前行的排名-1/分組內總行數-1

- PERCENT_RANK over(order by ...)
- PERCENT_RANK over(partition by ... order by ...)

5.專題--日期函數

- to_date:日期時間轉成日期函數
-from_unixtime:時間戳轉成制定格式的日期
-unix_timestamp:日期轉化成時間戳
-year/month/day/hour/minute/second
-weekofyear
-datediff
-date_sub
-date_add
-from_unixtime+unix_timestamp

6.參考資料

[hive詳解]
https://blog.csdn.net/hguisu/article/details/7256833
[hive官方手冊](https://cwiki.apache.org/confluence/display/Hive/LanguageManual
[hive窗口函數]
https://blog.csdn.net/qq_26937525/article/details/54925827
[hive常用函數大全(二)]
https://blog.csdn.net/scgaliguodong123_/article/details/60135385
[hive日期函數]
https://blog.csdn.net/u013421629/article/details/80450047



作者:木木木有想法
鏈接:https://www.jianshu.com/p/7bc58aa08185
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

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