Hive。。
什么是hive?
1、hive是一個運行在分布式應用程序上的一個數據倉庫管理工具
2、hive可以將hdfs上的具有結構的文件映射成一張表,,并且提供了類sql的語法來管理和分析這些表(本質就是hdfs上的文件)
3、用于描述文件和表的映射關系的數據叫做元數據,存儲在關系型數據庫中(mysql,oracle等)
4、默認情況下執行引擎為mapreduce(還有spark等)
hive是干什么的?
1、hive是一個運行在分布式應用程序上的一個數據倉庫管理工具
2、hive可以將hdfs上的具有一定結構的文件映射成一張表,,并且提供了類sql的語法來管理和分析這些表(本質就是hdfs上的文件)
為什么要使用hive?
1、直接使用mapreduce的話,代碼復雜度要高得多,而且人員學習成本高
2、項目周期要求短
3、mapreduce實現復雜查詢邏輯開發難度大
hive的優缺點
優點:
1、學習成本低
提供了類sql查詢語言,(簡單,容易上手),避免直接寫mapreduce(適合java不好,sql熟練),減少開發人員 的學習成本。
2、可擴展性好
hive運行在分布式應用程序上,分布式集群的擴展性是很好的
3、適合做離線分析處理(OLAP)
· hive延遲較高
4、延展性好
hive可以自定義函數
5、良好的容錯性
基于分布式應用程序
6、統一管理
提供了統一的元數據管理,將元數據存儲到關系型數據庫中(mysql,oracle等)
缺點
1、hql的表達能力有限
2、hive本身底層是mapreduce
hive自動生成的mapreduce作業,通常情況下不夠智能化
hive調優比較困難
3、延遲比較高,不適合OLTP
hive的架構和原理
hive的架構簡介
hive的體系結構分為以下幾部分:
第一層:指的是連接hive的客戶端接口層
- CLI (command line interface),指的是hive提供的shell命令(hive -e hive -f hive - i )
- JDBC/ODBC,指的是可以使用編程語言來來連接hive.比如,java,c++,ruby等
- webui, hive提供了web訪問接口
第二層:
- thrift server :第三方軟件服務項框架,當使用遠程方式連接時,需要使用這個服務。
- 元數據存儲: 指的是元數據存儲的位置,可以是mysql,oracle,derby等
第三層:驅動層
- 解析器(SQLParser):
作用就是解析語法的正確性,比如表是否存在、字段是否存在、SQL語義是否有誤。
- 編譯器(Compiler):
作用就是將正確的語法翻譯成mr程序,會與元數據庫進行交互,獲取對應的元數據,比如表名對應的文件路徑。
最后形成job程序
- 優化器(Optimizer):
將執行計劃進行優化,減少不必要的列、使用分區、使用索引等。優化job。
- 執行器(Executer):
將優化后的執行計劃提交給hadoop的yarn上執行。提交job。
hive的工作流程
7.1 與此同時,在執行時,執行引擎可以通過Metastore執行元數據操作(比如,create…as select操作)
hive與mpreduce的區別、
hive的底層就是mapreduce,hive就是對mapreduce的封裝。
hive與傳統型數據庫的區別
Hive和數據庫的比較如下表:
| ANSI SQL | 支持 | 不完全支持 |
| 更新 | UPDATE INSERT DELETE | INSERT OVERWRITE\ INTO TABLE |
| 事務 | 支持 | 支持(部分支持) |
| 模式 | 寫模式 | 讀模式 |
| 存儲位置 | 塊設備、本地文件系統 | HDFS |
| 延時 | 低 | 高 |
| 多表插入 | 不支持 | 支持 |
| 子查詢 | 完全支持 | 只能用在From子句中 |
| 視圖 | Updatable | Read-only |
| 可擴展性 | 低 | 高 |
| 數據規模 | 小 | 大 |
| 實時響應 | 毫秒級 | 秒級 |
hive的安裝
這里只寫本地模式安裝和遠程模式安裝
1、將hive和mysql安裝包上傳,解壓,更名,并且配置環境變量
2、因為安裝的是完全分布式,所以需要安裝mysql
3、設置hive-env.sh
export HIVE_CONF_DIR=/usr/local/hive/conf export JAVA_HOME=/usr/local/jdk export HADOOP_HOME=/usr/local/hadoop export HIVE_AUX_JARS_PATH=/usr/local/hive/lib4、設置hive-site.xml(conf里原來是沒有hive-site.xml的,只需要復制hive-default.xml就行)
<!--hive倉庫在hdfs的位置--> <property><name>hive.metastore.warehouse.dir</name><value>/user/hive/warehouse</value> </property><!-- 該參數主要指定Hive的臨時文件存儲目錄 --> <property><name>hive.exec.scratchdir</name><value>/tmp/hive</value> </property> <!-- 刪除所有的內容,只需要配置一下四個即可 --> <property><name>hive.exec.local.scratchdir</name><value>/usr/local/hive/iotmp/root</value> </property> <property><name>hive.downloaded.resources.dir</name><value>/usr/local/hive/iotmp/${hive.session.id}_resources</value> </property> <property><name>hive.querylog.location</name><value>/usr/local/hive/iotmp/root</value> </property> <property><name>hive.server2.logging.operation.log.location</name><value>/usr/local/hive/iotmp/root/operation_logs</value> </property><!-- 配置metastore服務項連接mysql的參數 --><!--配置mysql的連接字符串--> <property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://qianfeng03:3306/hive?createDatabaseIfNotExist=true</value> </property> <!--配置mysql的連接驅動--> <property><name>javax.jdo.option.ConnectionDriverName</name><value>com.mysql.jdbc.Driver</value> </property> <!--配置登錄mysql的用戶--> <property><name>javax.jdo.option.ConnectionUserName</name><value>root</value> </property> <!--配置登錄mysql的密碼--> <property><name>javax.jdo.option.ConnectionPassword</name><value>@Mm123123</value> </property>5、初始化元數據庫mysql
schematool -initSchema -dbType mysql初始化之后就可以在本地運行hive了。
啟動hive的命令:
hive命令會內置啟動metastore服務來連接關系型數據庫獲取元數據。
hive的遠程模式
遠程模式的簡介
遠程模式就是hive中的相關進程,比如metastore和hiveserver2這樣的進程單獨開啟,使用客戶端或者命令行進行遠程連接這兩個服務,就是遠程模式。客戶端可以再任何機器上,只要這臺機器連接到開啟了服務的服務器上,就可以進行操作。
服務端的配置
1、hive-site.xml
hive-site.xml和本地的配置一模一樣,如果在本地模式基礎上設置,hive-site.xml是不用變的。
2、使用遠程模式的話,需要配置hadoop的core-site.xml,添加下面兩個屬性
hive的兩種服務說明
第一種服務:hiveserver2
1. 該服務端口號默認是10000 2. 可以單獨啟動此服務進程,供遠程客戶端連接;此服務內置metastore服務。 3. 啟動方式:方法1:直接調用hiveserver2。會進入監聽狀態不退出。方法2:hive --service hiveserver2 & 進入后臺啟動方法3:hive --service hiveserver2 2>&1 >/dev/null &; #信息送入黑洞。第二種服務:metastore
1. 此服務才是真正連接元數據庫的服務進程 2. 也可以讓遠程客戶端連接 3. 啟動方式:方法1:- hive --service metastore &方法2:- hive --service metastore 2>&1 >/dev/null &; #信息送入黑洞。客戶端連接hiveserver2服務
說明:
-1. 連接此服務的hive客戶端,只需要配好環境變量即可 -2. 只能使用hive中的beeline連接工具進行連接此服務,beeline是hive的一個輕量級的連接客戶端工具。連接方式:
方式1:step1. beeline 回車step2. !connect jdbc:hive2://qianfeng02:10000 回車step3. 輸入用戶名 回車step4. 輸入密碼 回車 方法2(直連):1. beeline -u jdbc:hive2://qianfeng02:10000 -n 用戶名解析: hive2,是hive的協議名稱ip: hiveserver2服務所在的主機IP。10000,是hiveserver2的端口號客戶端連接metastore服務
注意:想要連接metastore服務的客戶端必須配置如下屬性和屬性值
<property><name>hive.metastore.uris</name> <value>thrift://qianfeng02:9083</value> </property>解析:thrift:是協議名稱ip為metastore服務所在的主機ip地址9083是默認端口號Hive基本操作-庫、表
規則
大小寫規則:
1. hive的數據庫名、表名都不區分大小寫 2. 建議關鍵字大寫命名規則:
1. 名字不能使用數字開頭 2. 不能使用關鍵字 3. 盡量不使用特殊符號庫操作語法
創建數據庫
創建數據庫的本質就是在hive的參數${hive.metastore.warehouse.dir}對應的目錄下創建一個新的目錄,此目錄的名稱格式為:庫名.db
注意:在創建庫或者表時除了創建目錄外,還會在元數據庫中添加元數據信息(描述信息)描述信息可以在關系型數據庫中查看,也可以在hive命令行使用 desc extended tableName來查看
** 查看所有數據庫**
語法:show databases;** 切換數據庫**
語法:use mydb;** 查看數據庫信息**
語法1:desc database databaseName; 語法2:desc database extended databaseName; 語法3:describe database extended databaseName;** 刪除數據庫**
語法1:drop database databasename; #這個只能刪除空庫 語法2:drop database databasename cascade; #如果不是空庫,則可以加cascade強制刪除表操作語法
數據類型
Hive的數據類型分為基本數據類型和復雜數據類型,下面是基本數據類型(復雜類型到后期再講)
其中加粗體是重點要掌握的類型
| 基本類型 | BOOLEAN | true/false | TRUE |
| TINYINT | 1字節的有符號整數 -128~127 | 1Y | |
| SMALLINT | 2個字節的有符號整數,-32768~32767 | 1S | |
| INT | 4個字節的帶符號整數 | 1 | |
| BIGINT | 8字節帶符號整數 | 1L | |
| FLOAT | 4字節單精度浮點數 | 1.0 | |
| DOUBLE | 8字節雙精度浮點數 | 1.0 | |
| DEICIMAL | 任意精度的帶符號小數 | 1.0 | |
| STRING | 字符串,可變長度 | “a”,’b’ | |
| VARCHAR | 變長字符串,要設置長度 | “a”,’b’ | |
| CHAR | 固定長度字符串 | “a”,’b’ | |
| BINARY | 字節數組 | 無法表示 | |
| TIMESTAMP | 時間戳,納秒精度 | 122327493795 | |
| DATE | 日期 | ‘2016-03-29’ | |
| 復雜類型 | ARRAY | 有序的的同類型的集合 | array(1,2) |
| MAP | key-value,key必須為原始類型,value可以任意類型 | map(‘a’,1,’b’,2) | |
| STRUCT | 字段集合,類型可以不同 | struct(‘1’,1,1.0) | |
| UNION | 在有限取值范圍內的一個值 | create_union(1,’a’,63) |
** 創建表**
創建表的本質其實就是在對應的數據庫目錄下面創建一個子目錄,目錄名為表名。數據文件就存在這個目錄下。
語法1: create table t_user(id int,name string); 語法2:使用庫.表的形式create table mydb.t_user(id int,name string);語法3:指定分隔規則形式 create table if not exists t1( uname string comment 'this is name', chinese int, math int, english int ) comment 'this is my table' row format delimited fields terminated by '\t' lines terminated by '\n' stored as textfile;查看當前表空間中的所有表名
語法:show tables; # 查看另外一個數據庫中的表 show tables in zoo;查看表結構
desc tableName desc extended tableName; describe extended tableName;** 修改表結構**
- 修改表名alter table oldTableName rename to newTableName;- 修改列名:change column alter table tableName change column oldName newName colType; - 修改字段類型:alter table tableName change column colName colName colType;- 修改列的位置: 注意,2.x版本后,必須是相同類型進行移動位置。alter table tableName change column colName colName colType after colName1; alter table tableName change column colName colName colType first;- 增加字段:add columnsalter table tableName add columns (sex int,...);- 刪除字段:replace columns #注意,2.x版本后,注意類型的問題,替換操作,其實涉及到位置的移動問題。alter table tableName replace columns(id int,name int,size int,pic string);注意:實際上是保留小括號內的字段。** 刪除表**
drop table tableName;擴展)建表語法
下面是一個常見的創建表的語法:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] TABLENAME( [COLUMNNAME COLUMNTYPE [COMMENT 'COLUMN COMMENT'],...]) [COMMENT 'TABLE COMMENT'] [PARTITIONED BY (COLUMNNAME COLUMNTYPE [COMMENT 'COLUMN COMMENT'],...)] [CLUSTERED BY (COLUMNNAME COLUMNTYPE [COMMENT 'COLUMN COMMENT'],...) [SORTED BY (COLUMNNAME [ASC|DESC])...] INTO NUM_BUCKETS BUCKETS] [ROW FORMAT ROW_FORMAT] [STORED AS FILEFORMAT] [LOCATION HDFS_PATH];如果要看完整的創建表語法,可以參考下面完整創建表語句:
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name -- (Note: TEMPORARY available in Hive 0.14.0 and later)[(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])][COMMENT table_comment][PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)][CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS][SKEWED BY (col_name, col_name, ...) -- (Note: Available in Hive 0.10.0 and later)] ON ((col_value, col_value, ...), (col_value, col_value, ...), ...) [STORED AS DIRECTORIES][ [ROW FORMAT row_format] [STORED AS file_format] | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)] -- (Note: Available in Hive 0.6.0 and later) ][LOCATION hdfs_path][TBLPROPERTIES (property_name=property_value, ...)] -- (Note: Available in Hive 0.6.0 and later)[AS select_statement]; -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)其中具體創建表的參數類型可以參考如下:
data_type: primitive_type| array_type| map_type| struct_type| union_type -- (Note: Available in Hive 0.7.0 and later)primitive_type: TINYINT| SMALLINT| INT| BIGINT| BOOLEAN| FLOAT| DOUBLE| DOUBLE PRECISION -- (Note: Available in Hive 2.2.0 and later)| STRING| BINARY -- (Note: Available in Hive 0.8.0 and later)| TIMESTAMP -- (Note: Available in Hive 0.8.0 and later)| DECIMAL -- (Note: Available in Hive 0.11.0 and later)| DECIMAL(precision, scale) -- (Note: Available in Hive 0.13.0 and later)| DATE -- (Note: Available in Hive 0.12.0 and later)| VARCHAR -- (Note: Available in Hive 0.12.0 and later)| CHAR -- (Note: Available in Hive 0.13.0 and later)array_type: ARRAY < data_type >map_type: MAP < primitive_type, data_type >struct_type: STRUCT < col_name : data_type [COMMENT col_comment], ...>union_type: UNIONTYPE < data_type, data_type, ... > -- (Note: Available in Hive 0.7.0 and later)row_format: DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char][MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char][NULL DEFINED AS char] -- (Note: Available in Hive 0.13 and later)| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]file_format:: SEQUENCEFILE| TEXTFILE -- (Default, depending on hive.default.fileformat configuration)| RCFILE -- (Note: Available in Hive 0.6.0 and later)| ORC -- (Note: Available in Hive 0.11.0 and later)| PARQUET -- (Note: Available in Hive 0.13.0 and later)| AVRO -- (Note: Available in Hive 0.14.0 and later)| JSONFILE -- (Note: Available in Hive 4.0.0 and later)| INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classnamecolumn_constraint_specification:: [ PRIMARY KEY|UNIQUE|NOT NULL|DEFAULT [default_value]|CHECK [check_expression] ENABLE|DISABLE NOVALIDATE RELY/NORELY ]default_value:: [ LITERAL|CURRENT_USER()|CURRENT_DATE()|CURRENT_TIMESTAMP()|NULL ] constraint_specification:: [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ][, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ][, CONSTRAINT constraint_name FOREIGN KEY (col_name, ...) REFERENCES table_name(col_name, ...) DISABLE NOVALIDATE [, CONSTRAINT constraint_name UNIQUE (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ][, CONSTRAINT constraint_name CHECK [check_expression] ENABLE|DISABLE NOVALIDATE RELY/NORELY ]數據導入
[root@qianfeng01 hive]# mkdir /hivedata [root@qianfeng01 hive]# cd /hivedata [root@qianfeng01 hive]# vi user.txt -- 加入下面的徐盛數據 1,廉德楓 2,劉浩 3,王鑫 4,司翔加載數據到Hive,一般分為兩種:
- 一種是從本地Linux上加載到Hive中 - 另外一種是從HDFS加載到Hive中**方法1:**使用hdfs dfs -put將本地文件上傳到表目錄下
hdfs dfs -put ./u1.txt /user/hive/warehouse/mydb1.db/u1**方法2:**在hive中使用load 命令
load data [local] inpath '文件路徑' [overwrite] into table 表名加載數據時: 1. 最好是寫絕對路徑,從根開始寫。 2. 寫相對路徑也是可以的,但是一定要記住你登錄hive時的位置,從當前位置寫相對路徑 3. ~在hive中,是相對路徑的寫法 4. 使用benline工具進行遠程登錄(客戶端與服務端不在同一臺機器)時,使用以下語句時:load data local inpath '文件路徑' [overwrite] into table 表名會有一個大坑:local是指服務端的文件系統。**方法3:**從另外一張表(也可稱之為備份表)中動態加載數據
insert into table tableName2 select [.....] from tableName1;擴展內容:向多張表中插入數據的語法from tableName1insert into tableName2 select * where 條件insert into tableName3 select * where 條件.....注意: tableName2表中的字段個數必須和tableName1表中查詢出來的個數相同
**方法4:**克隆表數據
- create table if not exists tableName2 as select [....] from tableName1; - create table if not exists tableName2 like tableName1 location 'tableName1的存儲目錄的路徑'擴展內容:只復制表結構 create table if not exists tableName2 like tableName1;加載數據的本質:
注意:hive使用的是嚴格的讀時模式:加載數據時不檢查數據的完整性,讀時發現數據不對則使用NULL來代替。
而mysql使用的是寫時模式:在寫入數據時就進行檢查
案例演示
CREATE TABLE flow( id string COMMENT 'this is id column', phonenumber string, mac string, ip string, url string, urltype string, uppacket int, downpacket int, upflow int, downflow int, issuccess int ) COMMENT 'this is log table' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' stored as textfile;加載數據: load data local inpath './data/HTTP_20130313143750.dat' into table flow;1、統計每個電話號碼的總流量(M) select l.phonenumber, round(sum(l.upflow + l.downflow) / 1024.0,2) as total from log1 l group by l.phonenumber ;2、第二個需求,求訪問次數排名前3的url: select l.url url, count(l.url) as urlcount from log1 l group by l.url order by urlcount desc limit 3 ;數據導出
hive數據導出分類
1. 從hive表中導出本地文件系統中(目錄、文件) 2. 從hive表中導出hdfs文件系統中 3. hive表中導出到其它hive表中導出到目錄下
--1. 導出數據到本地文件系統的目錄下 insert overwrite local directory '/root/out/00' select * from student;--2. 導出數據到hdfs的目錄下 insert overwrite directory '/root/out/01' select * from student;-- 導出的文件中字段默認不分隔。直接導入到本地文件系統的文件中:
[root@qianfeng01 ~]# hive -e 'select * from exercise.student' >> /root/out/02; -- 導出的文件中字段分隔符默認是\t修改導出后的列與列之間的格式:
insert overwrite local directory '/root/out/01' row format delimited fields terminated by ',' select * from student;表類型詳解
表分類
在Hive中,表類型主要分為兩種,
第一種:內部表
- 也叫管理表 - 表目錄會創建在集群上的{hive.metastore.warehouse.dir}下的相應的庫對應的目錄中。 - 默認創建的表就是內部表第二種:外部表
- 外部表需要使用關鍵字"external", - 外部表會根據創建表時LOCATION指定的路徑來創建目錄, - 如果沒有指定LOCATION,則位置跟內部表相同,一般使用的是第三方提供的或者公用的數據。 - 建表語法:必須指定關鍵字external。create external table tableName(id int,name string) [location 'path'];內部表和外部表轉換:
內部表轉外部表
alter table tableName set tblproperties('EXTERNAL'='TRUE'); 注意:內部表轉外部表,true一定要大寫;外部表轉內部表
alter table tableName set tblproperties('EXTERNAL'='false'); 說明:false不區分大小兩者之間區別
1) 內部表和外部表在創建時的差別
就差兩個關鍵字,EXTERNAL 和 LOCATION
舉例:
2) Hive表創建時要做的兩件事:
在hdfs下創建表目錄
在元數據庫mysql創建相應表的描述數據(元數據)
3) drop時有不同的特性:
1、drop時,元數據都會被清除
2、drop時,內部表的表目錄會被刪除,但是外部表的表目錄不會被刪除。
4) 使用場景
內部表: 平時用來測試或者少量數據,并且自己可以隨時修改刪除數據.
外部表:使用后數據不想被刪除的情況使用外部表(推薦使用)所以,整個數據倉庫的最底層的表使用外部表
Hive Shell技巧
查看所有hive參數
# 在hive命令行直接輸入set 即可 hive> set只執行一次Hive命令
通過shell的參數 -e 可以執行一次就運行完的命令
[root@qianfeng01 hive]# hive -e "select * from cat"小技巧2:可以通過外部命令快速查詢某個變量值:
hive -S -e “set” |grep cli.print
-S 是靜默模式,會省略到多余的輸出
單獨執行一個sql文件
通過參數-f +file文件名就可以,經常用在以后的sql文件單獨執行,導入數據場景中
[root@qianfeng01 hive]# hive -f /path/cat.sql小技巧:在shell內部 可以通過source命令來執行一個sql
執行Linux命令
在Hive的shell中 加上前綴! 最后以分號;結尾,可以執行linux的命令
hive> ! pwd ;執行HDFS命令
用戶可以在Hive的shell中執行HDFS的DFS命令,不用敲入前綴hdfs或者hadoop
hive> dfs -ls /tmp使用歷史命令和自動補全
在Hive的Shell操作中可以使用上下箭頭查看歷史記錄
如果忘記了命令可以用tab鍵進行補全
顯示當前庫:
下面是通過配置文件hive-site.xml顯示
<property><name>hive.cli.print.current.db</name><value>false</value><description>Whether to include the current database in the Hive prompt.</description> </property>當前session里設置該參數:
hive> set hive.cli.print.current.db=true;查看當前參數設置的值:
小技巧1:可以在shell中輸入set命令,可以看到hive已經設定好的參數
hive> set hive.cli.print.current.db;Hive基本查詢語法
基本使用規則
6.1.1 基本查詢語句組成
select .. from ..join [tableName] on ..where ..group by ..having ..order by ..sort by ..limit .. union | union all ...6.1.2 執行順序
第一步: FROM <left_table> 第二步: ON <join_condition> 第三步: <join_type> JOIN <right_table> 第四步: WHERE <where_condition> 第五步: GROUP BY <group_by_list> 第六步: HAVING <having_condition> 第七步: SELECT 第八步: DISTINCT <select_list> 第九步: ORDER BY <order_by_condition> 第十步: LIMIT <limit_number>標準sql語句的一些規則: -1. 列別名的使用,必須完全符合執行順序,不能提前使用。(mysql除外) -2. 在分組查詢時,select子句中只能含有分組字段和聚合函數,不能有其他普通字段。(mysql除外)6.1.3 查詢原則
1. 盡量不使用子查詢、盡量不使用in 或者not in (可以使用 [not] exists替代) 2. 盡量避免join連接查詢,但是通常避免不了 3. 查詢永遠是小表驅動大表(小表作為驅動表)--注意:內連接時,默認是左表是驅動表,因此左表一定要是小表。-- 外連接看需求而定。6.2 常用子句回顧
6.2.1 where語句特點
where后不能使用聚合函數,可以使用子查詢,也可以是普通函數。 條件可以是: 1. 關系表達式: =, >,>=,<,<=,!=,<> 2. 連接符號: or,and, between .. and .. 3. 模糊查詢: like %:通配符_:占位符 4. [not] in>all(set) >any();注意事項:在hive的where中如果使用了子查詢作為條件,等號“=”不好使,需要使用[not] in.換句話說,即使子查詢返回的是唯一的一個值,也是集合形式。6.2.2 group by語句特點
group by: 分組,通常和聚合函數搭配使用查詢的字段要么出現在group by 后面,要么出現在聚合函數里面聚合函數:count(),sum(),max(),min(),avg()count的執行 1. 執行效果上:- count(*)包括了所有的列,相當于行數,在統計結果的時候不會忽略null值- count(1)包括了所有列,用1代表行,在統計結果的時候也不會忽略null值- count(列名)只包括列名那一列,在統計結果時,會忽略null值2.執行效率上:- 列名為主鍵,count(列名)會比count(1)快- 列名不為主鍵,count(1)會比count(列名)快- 如果表中有多個列并且沒有主鍵,count(1)的效率高于count(*)- 如果有主鍵count(主鍵)效率是最高的- 如果表中只有一個字段count(*)效率最高6.2.3 having子句特點
對分組以后的結果集進行過濾。可以使用聚合函數。6.2.4 order by子句
對查詢的數據進行排序。 desc 降序 asc 升序語法: order by colName [desc|asc][,colName [desc|asc]]6.2.5 limit語句特點
limit : 從結果集中取數據的條數 將set hive.limit.optimize.enable=true 時,limit限制數據時就不會全盤掃描,而是根據限制的數量進行抽樣。同時還有兩個配置項需要注意: hive.limit.row.max.size 這個是控制最大的抽樣數量 hive.limit.optimize.limit.file 這個是抽樣的最大文件數量注意:limit 在mysql中 可以有兩個參數 limit [m,] n在hive中,只能有一個參數 limit n; 查詢前n條。一般情況下,在使用limit時,都會先order by排序。6.2.6 union | union all
union all:將兩個或者多個查詢的結果集合并到一起。不去重 union:將兩個或者多個查詢的結果集合并到一起,去重合并后的數據并排序 union語句字段的個數要求相同,字段的順序要求相同。join連接
總結