Hive的數據類型
Hive的基本數據類型
Hive的復雜數據類型
復雜數據類型包括數組(ARRAY)、映射(MAP)和結構體(STRUCT),具體如下表所示:
Hive的表庫操作
Hive的數據庫操作
Hive中數據庫的概念本質上僅僅是表的一個目錄或者命名空間。然而,對於具有 很多組和用戶的大集群來說,這是非常有用的,因為這樣可以避免表命名沖突。
如果用戶沒有使用use關鍵字顯示指定數據庫,那么將會使用默認的數據庫default。
查看數據庫
show databases;
使用like關鍵字實現模糊匹配
show databases like 'hive_*'; 檢索以hive開頭的數據庫
使用數據庫
use 數據庫名稱;
創建數據庫
create database 數據庫名;
刪除數據庫
drop database 數據庫名;(這種刪除,需要將對應數據庫中的表全部刪除后才能刪除數據庫)
drop database 數據庫名 cascade;(強制刪除,自行刪除所有表)
查看數據庫的描述
desc database 數據庫名;
Hive的數據表操作
顯示數據庫中的表
show tables;
使用like關鍵字實現模糊匹配
show tables like 'hive_*';
顯示表的詳細信息
desc [formatted] hive_01;(加上formatted顯示的更詳細)
創建數據表(與MySQL類似)
create [external] table [if not exists] table_name [(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)。
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 [WITHSERDEPROPERTIES(property_name=property_value,
property_name=property_value, ...)]
- fields terminated by char 列分隔符
- COLLECTION ITEMS TERMINATED BY char 集合元素直接的分隔符
- MAP KEYS TERMINATED BY char map集合KV的分隔符
- 用戶在建表的時候可以自定義SerDe或者使用自帶的SerDe,如果沒有指定ROW FORMAT 或者ROW FORMAT DELIMITED,將會使用自帶的SerDe,在建表的時候,用戶還需要為表指定列,用戶在指定表的列的同時也會指定自定義的SerDe,Hive通過SerDe確定表的具體的列的數據。
8:stored as指定存儲文件類型
常用的存儲文件類型:SEQUENCEFILE(二進制序列文件)、TEXTFILE(文本 不指定默認)、RCFILE(列式存儲格式文件)、ORCFILE(行列壓縮存儲文件)
如果文件數據是純文本,可以使用STORED AS TEXTFILE。如果數據是二進制文件,使用 STORED AS SEQUENCEFILE,如果數據需要壓縮請使用 STORED AS RCFILE 或 STORED AS ORCFILE
textfile 存儲空間消耗比較大,並且壓縮的text 無法分割和合並 查詢的效率最低,可以直接存儲,加載數據的速度最高。
sequencefile 存儲空間消耗最大,壓縮的文件可以分割和合並 需要通過text文件 轉化來加載。
rcfile 存儲空間小,查詢的效率高 ,需要通過text文件轉化來加載,加載的速度最低
orcfile 存儲空間最小,查詢的最高 ,需要通過text文件轉化來加載,加載的速度最低。
9:location指定在HDFS上的存儲位置
10:like允許用戶復制表的結構,但不復制數據。
#使用數據庫 use text; #創建表 create table [if not exists] test( id int, name string, hobby array<string> address map<string,string> )row format delimited fileds terminated by ' ' connection items terminated by ':' map keys terminated by '~'
#默認stored as儲存文件類型是textfile
#load加載數據(只有textfile類型的表才可以使用load)
load data local inpath '/usr/test/movies.dat' overwrite into table movie
#創建不同的文件儲存類型
create table [if not exists] test1(
id int,
name string,
hobby array<string> address map<string,string> )
stored as orcfile;
#除了textfile類型的儲存方式都得用insert加載數據
insert overwrite table test1 select * from test;
序列化器SerDe
//創建新表 指定SerDe 為RegexpSerDe正則 use b01; create table reg_table( id int, name string ) row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe' with serdeproperties('input.regex'="id=(.*),name=(.*)"); //.代表單個字符 * 0~N次 //加載數據 load data local inpath '/usr/local/hive_data/regexp_test' overwrite into table reg_table; //創建user用戶數據的指定JSON的序列化器 create table user_json_textfile( uid string, phone string, addr string ) row format serde 'org.apache.hive.hcatalog.data.JsonSerDe'; load data local inpath '/usr/local/xl_project/user/user_login_info.json' overwrite into table user_json_textfile;
Hive內部表&&外部表
未被external修飾的是內部表(managed table),被external修飾的為 外部表(external table)
內外部表的區別:
- 內部表數據由Hive管理,外部表數據由HDFS管理
- 內部表的數據的存儲位置是hive.metastore.warehouse.dir ,默認為/user/hive/warehouse中,外部表的數據存儲位置由自己指定。
- 刪除內部表中的數據會直接刪除元數據及存儲數據;刪除外部表僅僅會刪除元數據,HDFS上的數據並不會被刪除;
- 對內部表的修改會將修改直接同步給元數據;而對外部表的表結構和分區進行修改,則需要MSCK REPAIR TABLE table_name(將HDFS上的元數據信息寫入到metastore);
//創建外部表 create external table outter_table( id int, name string, hobby array<string>, address map<string,string> )row format delimited fields terminated by ',' collection items terminated by '-' map keys terminated by ':' location '/outter/data' //向外部表中載入數據 load data local inpath '/usr/local/person' into table outter_table;
Hive表的修改操作
表重命名
Alter table 舊名稱 RENAME to 新名稱;
alter table person rename to person_info;
修改列信息
Alter table 表名 CHANGE [COLUMN] 列名 新列名 數據類型
[COMMENT 注釋文本]
[AFTER 字段名稱|FIRST];
//修改列名稱 alter table test1 change name tename string; //修改列類型 alter table test1 change id id string;
//指定列位置
alter table test1 change id id string first;
這里會遇到類型兼容的問題,看下表:
Hive數據類型之間的隱式轉換
增加列
Hive能將新的字段添加到已有字段之后
Alter table 表名 ADD COLUMNS(
列名 字段類型 [COMMENT ‘注釋’],
........
);
//增加列(可以一次添加多個) alter table test1 add columns( img string, addr string )
刪除或替換列
Alter table 表名 REPLACE COLUMNS(
列名 字段類型 [COMMENT ‘注釋’],
............
);
//刪除替換列 alter table test1 replace columns( id string, name string, age string )
修改表的存儲屬性
Alter table表名 SET FILEFORMAT (TEXTFILE|SEQUENCEFILE|RCFILE|ORCFILE)
會出現嚴重問題:(TEXTFILE的數據無法直接向RCFILE和ORCFILE導入,由於RCFILE
與ORCFILE都是以塊狀存儲數據,我們只能通過insert語句導入到一個ORCFILE或RCFILE的新表中)。快對快,行對行
//修改表的存儲結構 alter table test1 set fileformat sequencefile
設置表的注釋
alter table 表名 set tblproperties('屬性名'='屬性值');
//設置表的注釋 alter table test1 set tblproperties('comment'='測試表')
修改表的分隔符
alter table 表名 set serdeproperties('屬性名'='屬性值');
//修改表的分隔符 alter table test1 set serdeproperties('field.delim'='~')
查看表的詳細的建表語句
Show create table 表名;
//展示創建表的詳細信息 show create table test1
修改表的serde_class
//修改表的序列化器 alter table test1 set serde 'org.apache.hadoop.hive.serde2.RegexSerDe' with serdeproperties ("input.regex" = "id=(.*),name=(.*),age=(.*)");
Hive添加jar包
add JAR '/usr/local/hive_data/hive-hcatalog-core-2.3.5.jar'(存放jar路徑和jar名稱)
Hive的分區操作
hive開發中,在存儲數據時,為了更快地查詢數據和更好地管理數據,都會對hive表中數據進行分區存儲。所謂的分區,在hive表中體現的是多了一個字段。而在底 層文件存儲系統中,比如HDFS上,分區則是一個文件夾,或者說是一個文件目錄,不同的分區,就是數據存放在根目錄下的不同子目錄里,可以通過show partitions查看。
靜態分區
//創建靜態分區表 create table test_partition ( id string comment 'ID', name string comment '名字') comment '測試分區' partitioned by (year int comment '年') ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;
insert語句:
//插入分區表數據(靜態分區) insert into table test_partition partition(year=2000) values(1,'小明'); insert into table test_partition partition(year=1999) values(2,'小紅'); insert into table test_partition partition(year=2000) values(3,'小蘭'); insert into table test_partition partition(year=1998) values(4,'小紫');
load語句:
load data local inpath '/usr/local/part_test' into table test_partition partition (year =2018); load data local inpath '/usr/local/part_test' into table test_partition partition (year =2018); load data local inpath '/usr/local/part_test' into table test_partition partition (year =2017);
動態分區
動態分區默認不開啟,需要使用下列語句開啟:
set hive.exec.dynamic.partition.mode=nonstrict;#需退出hive,重新進入執行
//創建動態分區 create table test_partitions ( id string comment 'ID', name string comment '名字', year int comment '年' )comment '測試' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;
insert語句:
insert into table test_partitions partition(year) values(5,'小白',2016);
insert into table test_partitions partition(year) values(6,'小黑',2016);
load語句:
load data local inpath '/usr/local/part_test' into table test_partitions partition (year);
修改分區
指定到新分區目錄下 原始分區仍舊存在 但是后續插入的新記錄會存儲到新分區中
alter table test_partitions partition(year=2016) set location '/user/hive/warehouse/new_part/b01.db/test_partition/year=2016';
刪除分區
alter table test_partitions drop partition(year=2016);
同步到關系型數據庫中的元信息
MSCK REPAIR TABLE test_partitions;
分桶表
分桶表描述
分桶是相對分區進行更細粒度的划分。分桶將整個數據內容安裝某列屬性值得hash值進行區分,如要安裝name屬性分為3個桶,就是對name屬性值的hash 值對3取摸,按照取模結果對數據分桶。如取模結果為0的數據記錄存放到一個文件,取模為1的數據存放到一個文件,取模為2的數據存放到一個文件。
//先設置一下分桶的權限
set hive.enforce.bucketing=true;
//創建分桶表 use test; create table student_bck (id int, name string) clustered by (id) sorted by (id desc) into 3 buckets row format delimited fields terminated by ",";
//插入數據 insert overwrite table student_bck select id,name from test_partition;
//查詢分桶數據 select * from student_bck tablesample(bucket 3 out of 3 on id);
tablesample (bucket x out of y on id);
# x表示從哪個桶(x-1)開始,y代表分幾個桶,也可以理解分x為分子,y為分母,及將表分為y份(桶),取第x份(桶)