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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mybatis中insert into ...select ...from dual union all select ... from dual 提示sql命令未結束的問題MyBatisSQL
- 解析MySQL中INSERT INTO SELECT的使用MySql
- SELECT INTO FROM mysql Undeclared variableMySql
- select into from 和 insert into select 的用法和區別
- Select from subquery 子查詢
- 關於 mysql 中的 select * from table_a,table_b 的問題MySql
- 優化select count(*) from t1優化
- Hibernate中不支援複雜子查詢from (select ……)解決方案
- Python Select 解析Python
- select 語句的解析過程
- SQL Server中SELECT語句執行順序解析SQLServer
- SQLite中的FROM子句SQLite
- select hang住等待SQL*Net message from ClientSQLclient
- [ OCRSRV][21]th_select_handler: Failed to retrieve procctx from......AI
- oracle中copy from的用法Oracle
- SQLite中的SELECT子句SQLite
- HTML中Select的使用HTML
- DataTable中的select()用法
- vue中select的使用以及select設定預設選中Vue
- [ OCRSRV][3736]th_select_handler: Failed to retrieve procctx from htAI
- Oracle中select ... for update的用法Oracle
- ORA-02030: can only select from fixed tables/viewsView
- SQL Server中的SELECT會阻塞SELECT相關資料SQLServer
- golang當中對select的理解Golang
- 淺談Golang中select的用法Golang
- javascript操作Select中的options集合JavaScript
- MySql 中 select 使用MySql
- How to resolve ORA-19706 error when select from dblinkError
- SELECT * FROM OPENXML在sql2000、sql2005中使用的不同XMLSQL
- Rust中的into函式和from函式Rust函式
- SQLite中的SELECT子句使用別名SQLite
- SQLite中的SELECT子句使用表示式SQLite
- 在select 中的where 中使用indexIndex
- oracle中建立insert select from 語句實現兩個表中某一個欄位相同統計其他不同欄位的情況Oracle
- 10G rac crsd.log :th_select_handler: Failed to retrieve procctx from htAI
- python中from module import * 的一個陷阱PythonImport
- Element外掛中Select元件的報錯元件
- SQLite中的SELECT子句使用萬用字元SQLite字元