2Hive表類型
- 1 Hive 數據類型
- 2 Hive 內部表
- 3 Hive 外部表
- 4 Hive 分區表
- 5 Hive 分桶表
- 6 Hive 視圖
1 Hive 數據類型
Hive的基本數據類型有:TINYINT,SAMLLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,TIMESTAMP(V0.8.0+)和BINARY(V0.8.0+)。
Hive的集合類型有:STRUCT,MAP和ARRAY。
Hive主要有四種數據模型(即表):內部表、外部表、分區表和桶表。
表的元數據保存傳統的數據庫的表中,當前hive只支持Derby和MySQL數據庫。
2 Hive 內部表
Hive中的內部表和傳統數據庫中的表在概念上是類似的,Hive的每個表都有自己的存儲目錄,除了外部表外,所有的表數據都存放在配置在hive-site.xml文件的${hive.metastore.warehouse.dir}/table_name目錄下。
創建內部表:
CREATE TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING, grade STRING COMMOT '班級')COMMONT '學生表'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORE AS TEXTFILE;
3 Hive 外部表
被external修飾的為外部表(external table),外部表指向已經存在在Hadoop HDFS上的數據,除了在刪除外部表時只刪除元數據而不會刪除表數據外,其他和內部表很像。
創建外部表:
CREATE EXTERNAL TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING, class STRING COMMOT '班級')COMMONT '學生表'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORE AS SEQUENCEFILE
LOCATION '/usr/test/data/students.txt';
4 Hive 分區表
分區表的每一個分區都對應數據庫中相應分區列的一個索引,但是其組織方式和傳統的關系型數據庫不同。在Hive中,分區表的每一個分區都對應表下的一個目錄,所有的分區的數據都存儲在對應的目錄中。
比如說,分區表partitinTable有包含nation(國家)、ds(日期)和city(城市)3個分區,其中nation = china,ds = 20130506,city = Shanghai則對應HDFS上的目錄為:
/datawarehouse/partitinTable/nation=china/city=Shanghai/ds=20130506/。
分區中定義的變量名不能和表中的列相同。
創建分區表:
CREATE TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING,class STRING COMMOT '班級')COMMONT '學生表'
PARTITIONED BY (ds STRING,country STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORE AS SEQUENCEFILE;
5 Hive 分桶表
桶表就是對指定列進行哈希(hash)計算,然后會根據hash值進行切分數據,將具有不同hash值的數據寫到每個桶對應的文件中。
將數據按照指定的字段進行分成多個桶中去,說白了就是將數據按照字段進行劃分,可以將數據按照字段劃分到多個文件當中去。
創建分桶表:
CREATE TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING, class STRING COMMOT '班級',score SMALLINT COMMOT '總分')COMMONT '學生表'
PARTITIONED BY (ds STRING,country STRING)
CLUSTERED BY(user_no) SORTED BY(score) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORE AS SEQUENCEFILE;
6 Hive 視圖
在 Hive 中,視圖是邏輯數據結構,可以通過隱藏復雜數據操作(Joins, 子查詢, 過濾,數據扁平化)來于簡化查詢操作。
與關系數據庫不同的是,Hive視圖并不存儲數據或者實例化。一旦創建 HIve 視圖,它的 schema 也會立刻確定下來。對底層表后續的更改(如 增加新列)并不會影響視圖的 schema。如果底層表被刪除或者改變,之后對視圖的查詢將會 failed。基于以上 Hive view 的特性,我們在ETL和數據倉庫中對于經常變化的表應慎重使用視圖。
創建視圖:
CREATE VIEW employee_skillsAS
SELECT name, skills_score['DB'] AS DB,
skills_score['Perl'] AS Perl,
skills_score['Python'] AS Python,
skills_score['Sales'] as Sales,
skills_score['HR'] as HR
FROM employee;
創建視圖的時候是不會觸發 MapReduce 的 Job,因為只存在元數據的改變。
但是,當對視圖進行查詢的時候依然會觸發一個 MapReduce Job 進程:SHOW CREATE TABLE 或者 DESC FORMATTED TABLE 語句來顯示通過 CREATE VIEW 語句創建的視圖。以下是對Hive 視圖的 DDL操作:
更改視圖的屬性:
ALTER VIEW employee_skills
SET TBLPROPERTIES ('comment' = 'This is a view');
重新定義視圖:
ALTER VIEW employee_skills AS
SELECT * from employee ;
刪除視圖:
DROP VIEW employee_skills;