hiveSQL常見面試題

小編前幾天去面試了一個大數據分析的崗位,學習了幾個月信心滿滿的小編被無情的面試教育了,被教育的不是一些高深的算法理論,而是一些hiveSQL。


這些題小編真不是不會,場景都非常熟悉,但就是容易忘。今天小編整理了一點常用場景的hiveSQL,很可能就能在面試中幫到你。


場景一:分組求TopN

先看數據:


hiveSQL常見面試題

(表-1)


好像把小編的數學成績暴露了,現在需要求每一門科目,成績排名前兩名的同學。


使用HiveSQL常用的方式為:

<code>Select * from table,/<code>
<code>row_number() over(partition by item order by score desc) rank/<code>
<code>where rank<=2;/<code>


輸出結果為:

hiveSQL常見面試題

(表-2)


解析:row_number()函數基於over對象分組、排序的記過,為每一行分組記錄返回一個序號,該序號從1開始,依次遞增,遇到新組則重新從1開始。也就是說,該函數計算的值表示每組內部排序後的順序編號。


然後在語句中加入限制條件rank<=2來篩選具體選取top幾。從最終的結果可以看出,語文成績考試前兩名的同學分別是建國和小編、數學成績排名前兩名的同學分別是建國和狗剩。


場景二:行轉列/列轉行

數據如下:


hiveSQL常見面試題

(表-3)


現在需要轉換為


hiveSQL常見面試題

(表-4)

使用hive實現需求的話,可以使用:

<code>Select/<code>
<code>name,/<code>
<code>sum(case when item=數學then score end)as math,/<code>
<code>sum(case when item=英語then score end)as english,/<code>
<code>From table/<code>
<code>Group by name/<code>


解析:首先寫出select name from table group by name, 因為select後有幾個字段,最終輸出就是幾個字段,所以我們需要把目標數據的”math”和“english”兩個字段想辦法得出來。


之後可以對item字段所有枚舉的結果進行case when判斷,將score填值進入,因為最後我們需要對name做一下聚合,需要明確的是一般選取字段一定要出現在groupby裡面。


聚合函數可以不用,所以我們在外面套一層sum做聚合,這樣得到sum的結果和單人得分結果是一致的,因為我們以name做了一遍聚合,而每個用戶對一門課程只有一個成績,所以這樣就可以得到最終結果。


那麼最後如果需要將“表-4”的內容轉換為“表-3”的內容應該怎麼做呢?

一種比較好的方式是這樣:

<code>select table_4.name,/<code>
<code>a.item,/<code>
<code>a.score/<code>
<code>from table_4/<code>
<code>lateral view explode(/<code>
<code>str_to_map(concat('math=',math,'&english=',english),'&','=')/<code>
<code>) a as item,score;/<code>


解析:首先使用str_to_map函數將math字段與english字段拼接後的結果轉換為map類型,然後通過側視圖和explode函數將其爆炸開,給生成的臨時側視圖一個名字,取名a並給列名取名為item,score,因為explode(map)爆炸的結果是每一個item為行,key為1列,value為1列,這樣就恰好形成我們想要的結果。這個示例理解起來稍微有點難度,大家不熟悉這些函數的用法的話,可以首先熟悉一下。


這些是一部分常見hiveSQL的面試場景,希望能夠幫到你,最後祝大家今後的面試成功喲!


分享到:


相關文章: