Hive中常用的交互式命令
hive -help
查看交互式命令
hive -e
不進入hive
的交互窗口執行sql
語句;
hive -f
執行腳本中的sql
語句,其中使用>
輸出到指定目錄下的文件當中(定時任務);
exit
先隱性提交數據,再退出;
quit
不提交數據,退出;
參數配置方式
- 配置文件方式
默認配置文件:hive-default.xml
用戶自定義配置文件:hive-site.xml
注意:用戶自定義配置會覆蓋
默認配置。 - 命令行參數方式
啓動Hive
時,可以在命令行添加-hiveconf param=value
來設定參數
注意:僅對本次hive
啓動有效。 - 參數聲明方式
可以在HQL
中使用SET
關鍵字設定參數
注意:僅對本次hive
啓動有效。
上述三種設定方式的優先級依次遞增。即配置文件<命令行參數<參數聲明。
Hive
數據類型
基本數據類型
Hive數據類型 | Java數據類型 | 長度 | 例子 |
---|---|---|---|
TINYINT | byte | 1byte有符號整數 | 20 |
SMALINT | short | 2byte有符號整數 | 20 |
INT | int | 4byte有符號整數 | 20 |
BIGINT | long | 8byte有符號整數 | 20 |
BOOLEAN | boolean | 布爾類型 | TRUE FALSE |
FLOAT | float | 單精度浮點數 | 3.14159 |
DOUBLE | double | 雙精度浮點數 | 3.14159 |
STRING | string | 字符系列 | ‘hello’ OR “world!” |
TIMESTAMP | 時間類型 | ||
BINARY | 字節數組 |
複雜數據類型
數據類型 | 描述 |
---|---|
STRUCT | 和c語言中的struct類似,都可以通過“點”符號訪問元素內容。例如,如果某個列的數據類型是STRUCT{first STRING, last STRING},那麼第1個元素可以通過字段.first來引用。 |
MAP | MAP是一組鍵-值對元組集合,使用數組表示法可以訪問數據。例如,如果某個列的數據類型是MAP,其中鍵->值對是’first’->’John’和’last’->’Doe’,那麼可以通過字段名[‘last’]獲取最後一個元素 |
ARRAY | 數組是一組具有相同類型和名稱的變量的集合。這些變量稱爲數組的元素,每個數組元素都有一個編號,編號從零開始。例如,數組值爲[‘John’, ‘Doe’],那麼第2個元素可以通過數組名[1]進行引用。 |
樣例:
name string,
friends array<string>,
children map<string, int>,
address struct<street:string, city:string>
)
row format delimited fields terminated by ',' -- 列分隔符
collection items terminated by '_' --MAP STRUCT 和 ARRAY 的分隔符(數據分割符號)
map keys terminated by ':' -- MAP中的key與value的分隔符
lines terminated by '\n'; -- 行分隔符
類型轉換
例如:CAST('1' AS INT)
將把字符串’1’ 轉換成整數1;如果強制類型轉換失敗,如執行CAST('X' AS INT)
,表達式返回空值 NULL
。
DDL
數據定義
- 數據庫創建
create database if not exists db_hive location '/db_hive2.db';
– 腳本中按照某種規律來建庫並放在指定位置,避免db_hive already exists
異常; - 數據庫刪除
drop database if exists db_hive2;
– 刪除空數據庫
drop database db_hive cascade;
–刪除數據庫,不管是不是空 - 創建表
[(col_name data_type [COMMENT col_comment], ...)]
[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]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
1.CREATE TABLE
創建一個指定名字的表。如果相同名字的表已經存在,則拋出異常;用戶可以用 IF NOT EXISTS
選項來忽略這個異常。
2. EXTERNAL
關鍵字可以讓用戶創建一個外部表,在建表的同時指定一個指向實際數據的路徑(LOCATION)
,Hive
創建內部表時,會將數據移動到數據倉庫指向的路徑;若創建外部表,僅記錄數據所在的路徑,不對數據的位置做任何改變。在刪除表的時候,內部表的元數據和數據會被一起刪除,而外部表只刪除元數據,不刪除數據。
3.COMMENT
:爲表和列添加註釋。
4. PARTITIONED BY
創建分區表
5. CLUSTERED BY
創建分桶表
6. SORTED BY
不常用
7.ROW FORMAT
DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
用戶在建表的時候可以自定義SerDe
或者使用自帶的SerDe
。如果沒有指定ROW FORMAT
或者ROW FORMAT DELIMITED
,將會使用自帶的SerDe
。在建表的時候,用戶還需要爲表指定列,用戶在指定表的列的同時也會指定自定義的SerDe
,Hive
通過SerDe
確定表的具體的列的數據。
SerDe是Serialize/Deserilize
的簡稱,目的是用於序列化和反序列化。
8. STORED AS
指定存儲文件類型
常用的存儲文件類型:SEQUENCEFILE
(二進制序列文件)、TEXTFILE
(文本)、RCFILE
(列式存儲格式文件)
如果文件數據是純文本,可以使用STORED AS TEXTFILE
。如果數據需要壓縮,使用 STORED AS SEQUENCEFILE
。
9.LOCATION
:指定表在HDFS
上的存儲位置。
10.LIKE
允許用戶複製現有的表結構,但是不復制數據。
內部表,Hive
會(或多或少地)控制着數據的生命週期。Hive
默認情況下會將這些表的數據存儲在由配置項hive.metastore.warehouse.dir
(例如,/user/hive/warehouse
)所定義的目錄的子目錄下。當我們刪除一個內部表時,Hive
也會刪除這個表中數據。管理表不適合和其他工具共享數據。
- 根據查詢結果創建表(查詢的結果會添加到新創建的表中)
create table if not exists student3 as select id, name from student;
- 根據已經存在的表結構創建表
create table if not exists student4 like student;
外部表(EXTERNAL
聲明),Hive
並非認爲其完全擁有這份數據。刪除該表並不會刪除掉這份數據,不過描述表的元數據信息會被刪除掉。
- 使用場景
每天將收集到的網站日誌定期流入HDFS
文本文件。在外部表(原始日誌表)的基礎上做大量的統計分析,用到的中間表、結果表
使用內部表存儲,數據通過SELECT+INSERT
進入內部表。
- 外部數據寫入
load data local inpath '/opt/module/datas/dept.txt' into table default.dept;
內MANAGED_TABLE
、外EXTERNAL_TABLE
部錶轉換
- 修改內部表
user_log
爲外部表
alter table user_log set tblproperties('EXTERNAL'='TRUE');
- 修改外部表
user_log
爲內部表
alter table user_logset tblproperties('EXTERNAL'='FALSE');
分區表,實際上就是對應一個HDFS
文件系統上的獨立的文件夾,該文件夾下是該分區所有的數據文件。Hive
中的分區就是分目錄,把一個大的數據集根據業務需要分割成小的數據集。在查詢時通過WHERE
子句中的表達式選擇查詢所需要的指定的分區,這樣的查詢效率會提高很多。
DML
數據定義
- 數據導入
hive> load data [local] inpath '/opt/module/datas/student.txt' overwrite | into table student [partition (partcol1=val1,…)];
(1)load data:
表示加載數據
(2)local:
表示從本地加載數據到hive表;否則從HDFS加載數據到hive表
(3)inpath:
表示加載數據的路徑
(4)overwrite:
表示覆蓋表中已有數據,否則表示追加
(5)into table:
表示加載到哪張表
(6)student:
表示具體的表
(7)partition:
表示上傳到指定分區
(0)創建一張表
試例
- 創建一張表
hive (default)> create table user_info(id string, name string) row format delimited fields terminated by '\t';
(1)加載本地文件到hive
hive (default)> load data local inpath '/opt/module/datas/user_info.txt' into table default.user_info;
(2)加載HDFS
文件到hive
中
上傳文件到HDFS
hive (default)> dfs -put /opt/module/datas/user_info.txt /user/atguigu/hive;
加載HDFS
上數據
hive (default)> load data inpath '/user/atguigu/hive/user_info.txt' into table default.user_info;
(3)加載數據覆蓋表中已有的數據
上傳文件到HDFS
hive (default)> dfs -put /opt/module/datas/user_info.txt /user/atguigu/hive;
加載數據覆蓋表中已有的數據
hive (default)> load data inpath '/user/atguigu/hive/user_info.txt' overwrite into table default.user_info;
- 使用核心
having與where不同點
(1)where
針對表中的列發揮作用,查詢數據;having
針對查詢結果中的列發揮作用,篩選數據;
(2)同group by
同時使用時,where
先過濾後聚合,having
先聚合後過濾;
(3)having
只用於group by
分組統計語句。
Join
連接
行轉列
CONCAT(string A/col, string B/col…):
返回輸入字符串連接後的結果,支持任意個輸入字符串;
CONCAT_WS(separator, str1, str2,...):
它是一個特殊形式的CONCAT()
。第一個參數剩餘參數間的分隔符
。分隔符可以是與剩餘參數一樣的字符串。如果分隔符是NULL
,返回值也將爲NULL
。這個函數會跳過分隔符參數後的任何NULL
和空字符串。分隔符將被加到被連接的字符串之間;
COLLECT_SET(col)
:函數只接受基本數據類型,它的主要作用是將某字段的值進行去重彙總
,產生array類型字段。
列轉行
EXPLODE(col):
將hive
一列中複雜的array
或者map
結構拆分成多行。
LATERAL VIEW
用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解釋:用於和split, explode
等UDTF
一起使用,它能夠將一列數據拆成多行數據,在此基礎上可以對拆分後的數據進行聚合。
窗口函數
OVER():
指定分析函數工作的數據窗口大小,這個數據窗口大小可能會隨着行的變而變化
CURRENT ROW:
當前行
n PRECEDING:
往前n
行數據
n FOLLOWING:
往後n
行數據
UNBOUNDED:
起點,UNBOUNDED PRECEDING
表示從前面的起點,UNBOUNDED FOLLOWING
表示到後面的終點
LAG(col,n):
往前第n
行數據
LEAD(col,n):
往後第n
行數據
NTILE(n):
把有序分區中的行分發到指定數據的組中,各個組有編號,編號從1
開始,對於每一行,NTILE
返回此行所屬的組的編號。注意:n
必須爲int
類型。
排序
RANK() :
排序相同時會重複,總數不會變
DENSE_RANK():
排序相同時會重複,總數會減少
ROW_NUMBER():
會根據順序計算