??Hive是基于Hadoop的一個數(shù)據(jù)倉庫,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張表开仰,并提供類sql查詢功能拟枚,Hive底層將sql語句轉(zhuǎn)化為mapreduce任務(wù)運行薪铜。Hive是一個數(shù)據(jù)倉庫众弓,不支持行級插入、更新以及刪除操作隔箍。Hive共有四種表谓娃,分別是內(nèi)部表、外部表蜒滩、分區(qū)表和桶表滨达。
?1. 內(nèi)部表
??內(nèi)部表有時也被稱為管理表。這種表會控制著數(shù)據(jù)的生命周期俯艰,Hive默認情況下會將這些表的數(shù)據(jù)存儲在由配置項hive.metastore.warehouse.dir所定義的目錄的子目錄下捡遍。當(dāng)我們刪除內(nèi)部表時,同時會刪除這個表中的數(shù)據(jù)竹握。內(nèi)部表不方便與其他工具共享數(shù)據(jù)画株。
??創(chuàng)建一個內(nèi)部表可以用如下語句:
#字段之間以逗號分隔
create table table_name(id int, name string) row format delimited fields terminated by ',';
?2. 外部表
??外部表指向特定目錄的一份數(shù)據(jù),Hive并不對該數(shù)據(jù)具有所有權(quán)啦辐。當(dāng)刪除表時谓传,不會刪除該目錄下的數(shù)據(jù),數(shù)據(jù)可以被多個工具共享芹关。即外部表只是對數(shù)據(jù)進行邏輯管理续挟,創(chuàng)建一個外部表需要用external關(guān)鍵字:
#location指明了該表指向的數(shù)據(jù)
create external table table_name(id int, name string) row format delimited fields terminated by ',' location '/data/order/order.data';
?3. 分區(qū)表
?? 分區(qū)表是一種內(nèi)部表。分區(qū)表通過指定一個或多個partition key侥衬,決定數(shù)據(jù)存放方式诗祸,進而優(yōu)化數(shù)據(jù)的查詢。每個表可以指定多個partition key轴总,每個partition在hive中以文件夾的形式存在直颅。如下所示是對數(shù)據(jù)的年份進行分區(qū),每個年份對應(yīng)一個文件夾肘习,年份相同的數(shù)據(jù)會放到同一個文件夾下:
??創(chuàng)建分區(qū)表時要注意開啟允許動態(tài)分區(qū)設(shè)置际乘,必要的時候還需要設(shè)置允許創(chuàng)建的最大分區(qū)數(shù)。
#開啟動態(tài)分區(qū)功能
set hive.exec.dynamic.partition=true;
#允許所有分區(qū)都是動態(tài)的
set hive.exec.dynamic.partition.mode=nonstricr;
#設(shè)置每個mapper或reducer可以創(chuàng)建的最大動態(tài)分區(qū)個數(shù)
set hive.exec.max.dynamic.partitions.pernode=1000;
#設(shè)置一個動態(tài)分區(qū)創(chuàng)建語句可以創(chuàng)建的最大分區(qū)個數(shù)
set hive.exec.dynamic.partitions=10000;
#全局可以創(chuàng)建的最大文件個數(shù)
set hive.exec.max.created.files=100000;
??創(chuàng)建分區(qū)表可以用以下語句:
#指定year為分區(qū)鍵漂佩,注意分區(qū)鍵不能同時出現(xiàn)在table_name后面脖含,否則會報錯
create table table_name(id int, name string) partitioned by(year int) row format delimited fields terminated by ',';
?4. 桶表
??桶表也是內(nèi)部表罪塔,桶表是對某一列的數(shù)據(jù)進行哈希取值以將數(shù)據(jù)打散,然后放到不用文件中存儲养葵。在Hive分區(qū)表中征堪,分區(qū)中的數(shù)據(jù)量過于龐大時,建議使用桶关拒。在分桶時佃蚜,對指定字段的值進行hash運算得到hash值,并使用hash值除以桶的個數(shù)取余進行分桶着绊。分桶后的查 詢效率比分區(qū)后的查詢效率更高谐算。下圖是按照年份分區(qū),再按id進行分桶后的結(jié)構(gòu):
??建表語句:
#該表按照year進行分區(qū)归露,每個分區(qū)又分成四個桶
create table table_name(id int, name string) partitioned by(year int) clustered by(id) into 4 buckets;
??end!