SQL-Hive中的Select From解析

大雄45發表於2021-05-19
導讀 今天我們來講講Hive中最常用的 select from 語句知識要點。Hive系列文章主要講資料分析中最基礎的SQL技能。

今天我們來講講Hive中最常用的 select from 語句知識要點。
SQL-Hive中的Select From解析SQL-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)>

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2772869/,如需轉載,請註明出處,否則將追究法律責任。

相關文章