一、Hive的數據類型
1.基本數據類型
由上表我們看到hive不支持日期類型,在hive里日期都是用字符串來表示的,而常用的日期格式轉化操作則是通過自定義函數進行操作。
hive是用java開發的,hive里的基本數據類型和java的基本數據類型也是一一對應的,除了string類型。有符號的整數類型:TINYINT、SMALLINT、INT和BIGINT分別等價於java的byte、short、int和long原子類型,它們分別為1字節、2字節、4字節和8字節有符號整數。Hive的浮點數據類型FLOAT和DOUBLE,對應於java的基本類型float和double類型。而hive的BOOLEAN類型相當於java的基本數據類型boolean。
對於hive的String類型相當於數據庫的varchar類型,該類型是一個可變的字符串,不過它不能聲明其中最多能存儲多少個字符,理論上它可以存儲2GB的字符數。
Hive支持基本類型的轉換,低字節的基本類型可以轉化為高字節的類型,例如TINYINT、SMALLINT、INT可以轉化為FLOAT,而所有的整數類型、FLOAT以及STRING類型可以轉化為DOUBLE類型,這些轉化可以從java語言的類型轉化考慮,因為hive就是用java編寫的。當然也支持高字節類型轉化為低字節類型,這就需要使用hive的自定義函數CAST了
2.復雜數據類型
復雜數據類型包括數組(ARRAY)、映射(MAP)和結構體(STRUCT/或者可以理解為對象),具體如下表所示:
3.文本的字符編碼
文本格式文件,毫無疑問,對於用戶來講,應該很熟悉以逗號或者制表符分割的文本文 件,只要用戶需要,Hive是支持這些文件格式的。然而這兩種文件格式有一個共同的缺點, 那就是用戶需要對文本文件中那些不需要作為分隔符處理的逗號或者制表符格外小心,也 因此,Hive默認使用了幾個控制字符,這些字符很少出現在字段值中。Hive使用屬於field來表示替換默認分隔符的字符。
二、數據庫的操作
1.創建數據庫
create database 數據庫名;
2.查看數據庫
//查看全部數據庫 SHOW DATABASES; //查看指定數據庫 SHOW DATABASE 數據庫名; //使用like實現模糊查詢,例如:以hive開頭的數據庫 SHOW DATABASE LIKE 'like_*'; //查看數據庫的詳細描 desc database hive_01;
3.使用數據庫
use 數據庫名;
4.刪除數據庫
//數據庫名;這種刪除,需要將對應數據庫中的表全部刪除后才能刪除數據庫 drop database 數據庫名; // 強制刪除,自行刪除所有表 drop database 數據庫名 cascade;
三、數據表操作
1.創建數據表
//創建內部表 create table inner_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 ':';//分割集合
注意事項:
我所創建的數據表根據每一個分割的符號根據自己的需求改寫
加載數據
//inpath后是Linux中要加載文件的路徑 overwrite表示從寫會清空加載之前的所有數據 load data local inpath '/hivetest/person.txt' overwrite into table person;
//創建外部表 //創建外部表需要運用external關鍵字 create external table inner_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' //此路徑是HDFS中的已有路徑
2.內部表和外部表的區別
雖然內部表和外部表只有一個關鍵字之差,但是性質是完全不一樣的,內部表存在hive中,若刪除則內部表不能恢復,外部表被刪除之后,在創建的外部表的hdfs路徑上回留下一個文件,當再次創建相同字段的類型時吧路徑指向原有的路徑那么不需要導入數據,創建表之后就自動存在,如果在新建的表中,只要local的路徑內存在着文件,那么文件會跟着創建的表類型匹配,產生錯誤的表.
如果 直接講表放到為外部表的位置 但是在hive中沒有該表的元數據,要通過 MSCK REPAIR TABLE table_name (將HDFS上的元數據信息寫入到metastore);
3.查看表
//查看表的全部內容 select * from 表名; //查看表結構 desc formatted 表名; //查看庫中的表 show tables; //將查詢的表結果放到新表 create table 表名 as select 查詢字句; //創建結構相同 沒有數據的表 CREATE TABLE 新表 LIKE 被復制的表;
4.刪除表
drop table 表名;
5.修改表
//1:表的重命名 alter table 源表名 rename to 新表名; //2:表修改列的信息 alter table 表名 change 表列名 新表列名 新表列名類型; //3:為表新增列(一次性插入多列) alter table 表名add columns( 列名1 列名1類型, 列名2 列名2類型 ) //4:刪除與替換列 在hive中本質上不能刪除 所以用替換來實現刪除的效果 alter table person_info replace columns( id string, name string, hobby array<string>, address map<string,string> ) //5:替換表的存儲格式 rcfile-->orcfile alter table t1 set fileformat sequencefile; //6:查看建表的語句 show create table 表名; //7:設置表的注釋 alter table person_info set tblproperties("comment"="person detail"); //8:修改表的分隔符 alter table person_info set serdeproperties( 'colelction.delim'='~'); //9:設置表的serde_class 序列化的類 create table t1(id int,name string,age int); alter table t1 set serde 'org.apache.hadoop.hive.serde2.RegexSerDe' with serdeproperties ("input.regex" = "id=(.*),name=(.*),age=(.*)")
注意事項:在修改類型時應該注意類型的兼容性如下圖: