SQL-Hive中的Select From解析
導讀 | 今天我們來講講Hive中最常用的 select from 語句知識要點。Hive系列文章主要講資料分析中最基礎的SQL技能。 |
今天我們來講講Hive中最常用的 select from 語句知識要點。
Hive系列文章預計10-20篇,主要講資料分析中最基礎的SQL技能。
查詢指定的某一列或某幾列, 如下:
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是資料庫名,如果當前查詢表與當前使用資料庫一致,可以省略不寫
在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';
上面的查詢語句會返回查詢到的所有資料,但有時候我們只是要確認一下表中的資料內容,或者要指定行資料,比如只要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)>
在查詢時可以對數值型別的欄位進行加減乘除和取餘等四則運算
下面我們將表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)>
可以看到上面的例子中我們透過兩個列相乘人為製造出一個新列,系統預設將其列名起為_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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- select into from 和 insert into select 的用法和區別
- 解析MySQL中INSERT INTO SELECT的使用MySql
- insert into select語句與select into from語句
- 關於 mysql 中的 select * from table_a,table_b 的問題MySql
- Hibernate中不支援複雜子查詢from (select ……)解決方案
- SQLite中的FROM子句SQLite
- DataTable中的select()用法
- SQLite中的SELECT子句SQLite
- vue中select的使用以及select設定預設選中Vue
- SQL Server中的SELECT會阻塞SELECT相關資料SQLServer
- 淺談Golang中select的用法Golang
- golang當中對select的理解Golang
- MySql 中 select 使用MySql
- 佔用資源狂高的select min(bitmapped) from ts$ where dflmaxext =:1 and bitand(flags, 1024) = 1024APP
- SQLite中的SELECT子句使用表示式SQLite
- SQLite中的SELECT子句使用別名SQLite
- Shading – jdbc 原始碼分析(三) – sql 解析之 SelectJDBC原始碼SQL
- Rust中的into函式和from函式Rust函式
- Element外掛中Select元件的報錯元件
- Linux中的sleep、usleep、nanosleep、poll和selectLinuxNaN
- SQLite中的SELECT子句使用萬用字元SQLite字元
- Linux中select()函式分析Linux函式
- SQLite中SELECT基本形式SQLite
- 徹底搞懂Python 中的 import 與 from importPythonImport
- 使用layui框架的select獲取選中的值UI框架
- node express 在使用mysql執行SELECT count(*) from xx獲取總數取值格式問題ExpressMySql
- ant design 中的 Select 元件常規寫法元件
- 【Java】NIO中Selector的select方法原始碼分析Java原始碼
- Go的SelectGo
- select * 和 select 所有欄位的區別
- 神From不再 From Software的內憂與外患
- select 下拉框選中事件事件
- AngularJS select中ngOptions用法詳解AngularJSGo
- go 中 select 原始碼閱讀Go原始碼
- select 下拉框用 Select select = new Select (element) 方法失敗
- java nio中的select和channel是怎麼使用的?Java
- Android原始碼分析(LayoutInflater.from(this).inflate(resId,null);原始碼解析)Android原始碼Null
- JQuery 獲取select被選中的value和textjQuery