Hive常用操作
前言
Hive支持常見的SQL語句, 除此之外它還有其獨特的部分. 常見SQL語句與關係型數據庫(例如MySQL)中的語法一致, 這裏就不再做詳細說明. 我們主要來看Hive中不一樣的部分.
Hive的所有操作可以去Hive官網查看, 點擊此處LanguageManual
Hive其實並不難, 對於有寫過SQL語句的人來說會更簡單. 在學習Hive時, 建議大家邊學邊敲, 多做聯繫.
準備工作
既然要使用Hive就要有Hive的環境, 可以根據這篇博客來安裝Hive以及與Hive相關的環境(Hadoop, Yarn)大數據生態圈搭建
這裏我使用的是基於Mysql的遠程模式來操作Hive.
操作流程
創建第一個表格
連接進入Hive shell 之後, 先建一個新的數據庫, 之後的大部分操作我們都在這個數據庫中來練習.
創建:
create database hive_test;
使用該數據庫:
use hive_test;
然後, 創建第一個表gfstbl:
CREATE TABLE gfstbl(
id INT,
name STRING,
age INT,
gfs ARRAY<STRING>,
address MAP<STRING,STRING>,
info STRUCT<country:String,province:String,city:String>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';
解釋說明:
- create語句, ()中爲字段之間用逗號分隔, 字段名稱與類型之間用空格隔開. 這裏字段的數據類型有整型, 字符串, 數組, 鍵值對以及結構體.
Hive支持的數據類型:
數據類型 | 註釋 |
---|---|
tinyint | 短整型, 範圍:-128~127 |
smallint | 小整型, -32768~32767 |
int | 整型, -232~232-1 |
bigint | 大整型, 就很大 |
float | 單精度浮點數 |
double | 雙精度浮點數 |
decimal | 精度38位十進制數 |
date | 日期 |
timestamp | 時間戳 |
char | 字符 |
string | 字符串 |
varchar | 可變長度字符串 |
array | 數組類型 |
map | 鍵值對類型 |
structs | 結構化類型 |
- ROW FORMAT DELIMITED : 行格式分隔
- FIELDS TERMINATED BY ’ ’ : 字段之間使用空格分隔
- COLLECTION ITEMS TERMINATED BY ‘,’ : 集合(就是這的數據)使用逗號分隔
- MAP KEYS TERMINATED BY ‘:’ : 鍵值對使用冒號分隔
- LINES TERMINATED BY ‘\n’ : 記錄之間使用換行符分隔
- ; : 每一條SQL語句結尾都需要以分號結束
- 除此之外, 如果去掉分號, 加上:LOCATION “/test”; , 就可設置源數據在HDFS中存放的位置, 若不設置默認就在Hive的工作目錄區.
創建表的SQL語句公式如下, 我們會根據Hive表的類型將這一公式分開操作.
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 [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)
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
LIKE existing_table_or_view_name
[LOCATION hdfs_path];
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_classname
constraint_specification:
: [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE ]
[, CONSTRAINT constraint_name FOREIGN KEY (col_name, ...) REFERENCES table_name(col_name, ...) DISABLE NOVALIDATE
查看第一個表的結構
查看錶結構的公式:
DESCRIBE [EXTENDED|FORMATTED] table_name
- EXTENDED 極簡的方式顯示
- FORMATTED 格式化方式來顯示
只查看錶字段及類型, 結果如下圖
DESC gfstbl;
或
DESCRIBE gfstbl;
極簡方式查看錶結構, 結果如下圖
DESCRIBE EXTENDED gfstbl;
格式化方式查看錶, 結果如下圖
DESCRIBE FORMATTED gfstbl;
表中加載數據
待加載數據
數據內容如下:
001 zhangsan 19 Girl1,Girl2,Girl3 Girl1:qingdao,Girl2:jinan,Girl3:nanjing zhongguo,shandong,weifang
002 lisi 20 GirlA,GirlB GirlA:American,GirlB:長沙 zhongguo,shandong,qingdao
將這兩行數據複製到gfs.txt文件中
vim /root/gfs.txt
然後複製粘貼數據
導入數據到Hive表中
load data local inpath '/root/gfs.txt' into table hive_test.gfstbl;
需要注意: load方式插入數據不會啓動MR任務, load的實質是將文件上傳到hdfs目錄中.
查看數據的三種方式
- 使用select語句
select * from gfstbl;
2. 通過hdfs集羣操作
hdfs dfs -ls /user/hive_meta/warehouse/hive_test.db/gfstbl
hdfs dfs -cat /user/hive_meta/warehouse/hive_test.db/gfstbl/*
3. 通過webUI頁面
進圖webUI頁面, 找到文件對應位置
查看數組,鍵值對,結構體數據的某個值
對於 數組 使用 : 列名[索引] 的形式查看(索引下標從0開始)
對於鍵值對使用 : 列名[“Key”]
對於結構體使用 : 列名.屬性
select gfs[0],address["Girl2"],info.city from gfstbl;
刪除表的方式
drop table gfstbl2;
此處需要注意, 如果通過hdfs操作刪除表所在的目錄, hive中表還會存在. 原因在於mysql的hive_meta數據庫中還存有該表的元數據信息.
知識積累
Hive中創建表的三種方式
- 通過編寫完整的CREATE語句創建, 如上文中我們創建gfstbl時的語句:
CREATE TABLE gfstbl(
id INT,
name STRING,
age INT,
gfs ARRAY<STRING>,
address MAP<STRING,STRING>,
info STRUCT<country:String,province:String,city:String>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';
- 通過使用CREATE和LIKE關鍵詞創建一個與原來表結構完全相同, 但沒有數據的新表:
create table gfstbl1 like gfstbl;
- 通過使用CREATE, AS和SELECT關鍵詞創建一個不僅表結構一樣而且數據也一樣的新表:
create table gfstbl2 AS SELECT id,name,gfs,address,info from gfstbl;
注意, 由於這種方式插入數據使用的是insert來插入數據, 因此會啓動MR任務.
Hive表中插入數據的四種方式
- insert 新數據, 最簡單, 最基本也是最少用的方式, 直接寫insert語句.
insert into table(col...) values(val...)
- load方式, 最常用也是效率最高的方式
LOAD DATA命令,可分爲LOAD DATA LOCAL INPATH和LOAD DATA INPATH。兩者的區別在於LOCAL導入的是本地文件而不加LOCAL的導入的是HDFS文件
LOAD DATA INPATH '/a.txt' INTO TABLE user
- 查詢(select)其他表數據 insert 到新表中
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;
或
FROM from_statement
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1
習慣上使用第二種語法, 即將from語句提前, 減少SQL代碼的冗餘.
from user
insert into user_count
select count(*)
insert into user_copy
select *;
- 直接使用hdfs命令將符合格式的文件放到該表在HDFS對應的目錄下
Hive中表的類型
- 內部表
與數據庫中的Table在概念上類似, 每一個內部表在Hive中都有一個相應的目錄存數據, 所有表的數據(不包括External Table)都保存在這個目錄中.
刪除表時,元數據與數據都會刪除.
-
臨時表
臨時表的生命週期是一次會話, 當本次會話結束時, 臨時表會自動刪除. -
外部表
刪除表時, 元數據會被刪除, 但數據(存放在HDFS)不會被刪除. -
分區表
將一批數據分成多個目錄來存儲, 從而防止暴力掃描. 分區表分爲靜態分區表和動態分區表. -
分桶表
分桶表是對列值取哈希值的方式,將不同數據放到不同文件中存儲. 由列的哈希值除以桶的個數來決定每條數據劃分在哪個桶中, 對於hive中每一個表、分區都可進一步分桶.
對這五種表的學習, 會在後續博客中再來講解.