「基礎」SQL-Hive中的Select From 解析
你好,我是巡山貓!
今天我們來講講Hive中最常用的 select from 語句知識要點。
Hive系列文章預計10-20篇,主要講數據分析中最基礎的SQL技能。
01-查詢表中的內容
查詢指定的某一列或某幾列,命令如下:
- SELECT 列名1,列名2,…… FROM 表名;
查詢表中的所有字段時,可以使用*代表所有字段。星號(*)是選取所有列的快捷方式。命令如下:
- SELECT * FROM 表名;
如果我們想查詢表 t_od_use_cnt 中的所有的user_id和use_cnt,具體命令如下:
- SELECT user_id
- ,use_cnt
- FROM app.t_od_use_cnt;
備注:app是數據庫名,如果當前查詢表與當前使用數據庫一致,可以省略不寫
02-Hive嚴格模式
在Hive中這樣寫雖然語法正確(不加分區),但在實際工作中這樣寫很可能會報錯。
因為Hive中的表一般數據量極大,為了防止用戶誤操作進行全表掃描,可以設置為查詢分區表時必須加入分區限制。比如這里我們的分區字段是date_8這個日期字段,工作中的表會要求我們必須限定查詢哪幾天的分區數據。這里我們可以輸入設置參數進行模擬,命令如下:
- hive (app)> set hive.mapred.mode;
- hive.mapred.mode=nonstrict
- hive (app)> set hive.mapred.mode=strict;
- hive (app)> set hive.mapred.mode;
- hive.mapred.mode=strict
然后我們重新執行上面的查詢語句,報錯如下:
- hive (app)> SELECT user_id
- > ,use_cnt
- > FROM app.t_od_use_cnt;
- FAILED: SemanticException [Error 10041]: No partition predicate found for Alias "t_od_use_cnt" Table "t_od_use_cnt"
- hive (app)>
如下使用where語句限定分區即可解決這個問題:
- SELECT user_id
- ,use_cnt
- FROM app.t_od_use_cnt
- WHERE date_8 = '20210420';
03-limit限制查詢返回行數
上面的查詢語句會返回查詢到的所有數據,但有時候我們只是要確認一下表中的數據內容,或者要指定行數據,比如只要100行,這時只需要在查詢語句后加上(limit 數字)即可。
查詢表t_od_use_cnt中前5行數據,命令如下:
- SELECT user_id
- ,use_cnt
- FROM app.t_od_use_cnt
- WHERE date_8 = 20190101 Limit 5;
運行結果如下:
- hive (app)> SELECT user_id
- > ,use_cnt
- > FROM app.t_od_use_cnt
- > WHERE date_8 = 20210420 Limit 5;
- OK
- user_id use_cnt
- 10000 6
- 10001 49
- 10002 23
- 10003 1
- 10004 29
- Time taken: 0.829 seconds, Fetched: 5 row(s)
- hive (app)>
04-列四則運算
在查詢時可以對數值類型的字段進行加減乘除和取余等四則運算
下面我們將表t_od_use_cnt中use_cnt列和is_active列相乘得到一個新列,其他用法依次類推。
- hive (app)> SELECT user_id
- > ,use_cnt
- > ,is_active
- > ,use_cnt * is_active
- > FROM app.t_od_use_cnt
- > WHERE date_8 = 20210420 Limit 5;
- OK
- user_id use_cnt is_active _c3
- 10000 6 1 6
- 10001 49 1 49
- 10002 23 1 23
- 10003 1 0 0
- 10004 29 1 29
- Time taken: 0.124 seconds, Fetched: 5 row(s)
- hive (app)>
05-列別名
可以看到上面的例子中我們通過兩個列相乘人為制造出一個新列,系統默認將其列名起為_c3。通常有必要給這些新產生的列起一個別名。已有列的列名如果含義不清晰也可以通過起別名的方式進行更改。不過別名只在本條SQL語句中生效,不影響原表中的字段名。
這里順便介紹一下字段命名規則:
1.不能和已有字段重復
2.只能包括小寫字母(a-z)、數字(0-9)、下劃線(_)
3.以字母開頭
4.單詞之間用下劃線_分割
這里我們將別名起為active_use_cnt,在列后面加 AS active_use_cnt即可。另AS可以省略,只用空格分隔別名也可以生效
- hive (app)> SELECT user_id
- > ,use_cnt
- > ,is_active
- > ,use_cnt * is_active AS active_use_cnt
- > FROM app.t_od_use_cnt
- > WHERE date_8 = 20210420 Limit 5;
- OK
- user_id use_cnt is_active active_use_cnt
- 10000 6 1 6
- 10001 49 1 49
- 10002 23 1 23
- 10003 1 0 0
- 10004 29 1 29
- Time taken: 0.239 seconds, Fetched: 5 row(s)
- hive (app)>