hive sql數(shù)據(jù)分析面試整理

1.寫(xiě)作目的說(shuō)明

hive sql是從事數(shù)據(jù)分析的同學(xué)的基本功盖奈。無(wú)論是秋招混坞、春招或者是實(shí)習(xí),sql都是面試官考察的重點(diǎn)钢坦,拿剛剛過(guò)去的19秋招來(lái)說(shuō)究孕,搜狐、網(wǎng)易爹凹、京東等在數(shù)據(jù)分析師崗位面試時(shí)都考了sql厨诸,而拼多多在數(shù)據(jù)分析筆試時(shí)就安排了四到五道復(fù)雜的sql題,雖然實(shí)習(xí)的難度會(huì)比秋招要小禾酱,可是sql仍然是重頭戲微酬。因此可以說(shuō)數(shù)據(jù)分析的敲門(mén)磚之一就是sql
在工作中,也有人戲稱(chēng)數(shù)據(jù)分析師是sql提數(shù)機(jī)颤陶,也有職場(chǎng)前輩說(shuō)數(shù)據(jù)分析師不應(yīng)該甘心成為一個(gè)提數(shù)機(jī)颗管,但是在沉淀業(yè)務(wù)理解之前,快速準(zhǔn)確的提數(shù)也是數(shù)據(jù)分析師必經(jīng)的階段滓走。
下面進(jìn)入正題

2.hive簡(jiǎn)介

hive是基于hadoop構(gòu)建的一套數(shù)據(jù)倉(cāng)庫(kù)查詢(xún)系統(tǒng)垦江,支持使用sql語(yǔ)句對(duì)存儲(chǔ)在hadoop里面的分布式文件系統(tǒng)進(jìn)行分析,將結(jié)構(gòu)化的數(shù)據(jù)映射成一張表搅方,通過(guò)將sql語(yǔ)句轉(zhuǎn)化成mapreduce任務(wù)進(jìn)行運(yùn)行比吭,從而實(shí)現(xiàn)查詢(xún)分析的功能

3.簡(jiǎn)單常用函數(shù)

其中3.1/3.2/3.3需要了解绽族,3.4的內(nèi)容是必須掌握

3.1 創(chuàng)建臨時(shí)表

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 查詢(xún)字段

查詢(xún)語(yǔ)句是面試中的重頭戲梗逮,需要面試者將查詢(xún)函數(shù)組合在一起實(shí)現(xiàn)某個(gè)需求项秉,比如給出查詢(xún)?nèi)嗯鷶?shù)學(xué)成績(jī)前五名的學(xué)生姓名這個(gè)問(wèn)題,應(yīng)該怎么分析呢慷彤?
在解答上面的問(wèn)題之前娄蔼,需要牢記hive sql語(yǔ)句的執(zhí)行順序,從前到后依次是:

  • from + 表名
  • on +字段
  • (left/right)join +表名
  • where +條件
  • group by +字段
  • having + 條件
  • select +字段
  • distinct +字段
  • union +結(jié)果集
  • order by +字段
  • limit +數(shù)量
    我的習(xí)慣是執(zhí)行順序就是我思考分析的順序底哗,但是代碼最終的呈現(xiàn)順序和執(zhí)行順序略有不同岁诉,對(duì)上面這個(gè)問(wèn)題來(lái)說(shuō),首先在問(wèn)題中可以知道最終選出的字段是學(xué)生姓名跋选,那么就明確了select的字段只有一個(gè)涕癣,就是name
    接著想到執(zhí)行順序第一個(gè)是from,那么一定有一個(gè)表前标,無(wú)論是中間表還是原始表坠韩,一定可以接著寫(xiě)下這樣的語(yǔ)句
FROM scores //假設(shè)scores是表名

接著執(zhí)行順序到了on和join,這時(shí)候就要考慮是不是需要連表的問(wèn)題,假設(shè)在這個(gè)問(wèn)題中需要連表炼列,因?yàn)闀?huì)有一張表basic記錄了全校學(xué)生的性別只搁,那么這時(shí)候就需要把score和basic連在一起,接下來(lái)就可以這么寫(xiě)

FROM scores // 這是之前寫(xiě)過(guò)的
LEFT JOIN basic
ON scores.name = basic.name

接著執(zhí)行順序到了where,where的限定條件有三個(gè)俭尖,分別是三班氢惋,數(shù)學(xué),女生稽犁,那么寫(xiě)下來(lái)就是

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

接著執(zhí)行順序到了group by ,having 焰望,這個(gè)問(wèn)題不需要這個(gè)函數(shù),那么接下來(lái)執(zhí)行順序到了select,如之前所說(shuō)已亥,代碼的書(shū)寫(xiě)順序和執(zhí)行順序熊赖,所以select語(yǔ)句要寫(xiě)在前面

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

可是我們并沒(méi)有實(shí)現(xiàn)前五名的查找,我們目前只是查到了所有人的名字虑椎,所以需要根據(jù)成績(jī)來(lái)對(duì)名字進(jìn)行排序秫舌,select之后的執(zhí)行順序是distinct和union這里我們并不需要,因此要用order by 進(jìn)行排序

(SELECT scores.name,scores.score // 增加了一個(gè)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

你會(huì)有疑問(wèn)為什么要加上score字段绣檬,因?yàn)閛rder by是在select 之后執(zhí)行足陨,他需要在select出來(lái)的那些字段里進(jìn)行排序,如果我們沒(méi)有加上score,那么order by就找不到要排序的字段了娇未,因此我們要在a表的基礎(chǔ)上再進(jìn)行一次select才可以墨缘,只把name字段選擇出來(lái),并且通過(guò)limit把前5名選出來(lái),

SELECT a.name
FROM
(SELECT scores.name,scores.score // 增加了一個(gè)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

剛才的分析問(wèn)題解答完畢。

4.復(fù)雜窗口函數(shù)

在sql中有聚合函數(shù)镊讼,它的作用是把多行數(shù)據(jù)聚成一行宽涌,比如count,sum,avg,max,min就是常見(jiàn)的聚合函數(shù),但是當(dāng)我們既想要保留聚合前的數(shù)據(jù)又想要看到聚合后新字段的數(shù)據(jù)時(shí)蝶棋,就需要用到窗口函數(shù)卸亮,那么窗口函數(shù)的執(zhí)行順序是怎樣的呢?窗口函數(shù)的執(zhí)行順序靠后玩裙,在order by之前兼贸。
窗口函數(shù)有以下幾種形式

4.1 普通型

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

可選擇的如下:

- UNBOUNDED PRECEDING 起點(diǎn)
- UNBOUNDED FOLLOWING 終點(diǎn)
- CURRENT ROW 當(dāng)前行
- 數(shù)字+PRECEDING 前幾行
- 數(shù)字+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() :對(duì)全局?jǐn)?shù)據(jù)切片
- ntile(3) over(partition by ...):對(duì)分組之后的數(shù)據(jù)切片
- ntile(3) over(order by ...):對(duì)數(shù)據(jù)按照升序后切片
- ntile(3) over(partition by ... order by ...):對(duì)數(shù)據(jù)分組并按照升序后切片

4.6 百分型

1.小于等于當(dāng)前值的行數(shù)/分組內(nèi)總行數(shù)

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

2.分組內(nèi)當(dāng)前行的排名-1/分組內(nèi)總行數(shù)-1

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

5.專(zhuān)題--日期函數(shù)

- to_date:日期時(shí)間轉(zhuǎn)成日期函數(shù)
-from_unixtime:時(shí)間戳轉(zhuǎn)成制定格式的日期
-unix_timestamp:日期轉(zhuǎn)化成時(shí)間戳
-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官方手冊(cè)](https://cwiki.apache.org/confluence/display/Hive/LanguageManual
[hive窗口函數(shù)]
https://blog.csdn.net/qq_26937525/article/details/54925827
[hive常用函數(shù)大全(二)]
https://blog.csdn.net/scgaliguodong123_/article/details/60135385
[hive日期函數(shù)]
https://blog.csdn.net/u013421629/article/details/80450047

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吃溅,一起剝皮案震驚了整個(gè)濱河市溶诞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌决侈,老刑警劉巖螺垢,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異赖歌,居然都是意外死亡枉圃,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)庐冯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)讯蒲,“玉大人,你說(shuō)我怎么就攤上這事肄扎。” “怎么了赁酝?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵犯祠,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我酌呆,道長(zhǎng)衡载,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任隙袁,我火速辦了婚禮痰娱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘菩收。我一直安慰自己梨睁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布娜饵。 她就那樣靜靜地躺著坡贺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上遍坟,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天拳亿,我揣著相機(jī)與錄音,去河邊找鬼愿伴。 笑死肺魁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的隔节。 我是一名探鬼主播鹅经,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼官帘!你這毒婦竟也來(lái)了瞬雹?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤刽虹,失蹤者是張志新(化名)和其女友劉穎酗捌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體涌哲,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胖缤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阀圾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哪廓。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖初烘,靈堂內(nèi)的尸體忽然破棺而出涡真,到底是詐尸還是另有隱情,我是刑警寧澤肾筐,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布哆料,位于F島的核電站,受9級(jí)特大地震影響吗铐,放射性物質(zhì)發(fā)生泄漏东亦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一唬渗、第九天 我趴在偏房一處隱蔽的房頂上張望典阵。 院中可真熱鬧,春花似錦镊逝、人聲如沸壮啊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蒂秘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間染突,已是汗流浹背捻爷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留份企,地道東北人也榄。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像司志,于是被迫代替她去往敵國(guó)和親甜紫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容