hive里分了create table和create external table,external table的好處就是表結構和數據是解綁的,刪除表並不會刪除數據,表相當於就是定義了去解析相對應的文件時的規范而已。
一個比較常見的應用場景是將網站的用戶瀏覽數據建立一個外表,然后按天做分區加快查找效率。
創建表
create EXTERNAL table sms_detail( mobile_type int, msg_id bigint) partitioned by (data_date string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' lines terminated by '\n' stored as textfile;
我們建立了一張叫做sms_detail的外表,現在不需要任何數據的,我們定義了分區字段data_date。分區字段相當於數據表多了一個字段,這個字段在select *時是不會出現的,但是可以放在where之后
插入數據和分區
很多時候我們會按天分區,比如我們hdfs上的文件結構是這樣的/home/user1/smsdata/2015-03-18,/home/user1/smsdata/2015-03-19。。。然后我們現在要把數據和外表對應起來,命令如下
alter table sms_detail add if not exists partition(data_date='2015-03-18') location '/share/comm/esp/sms/sms_detail/2015-03-18'
這條命令往外表上添加了一個新的partition,並且把location對應的數據和這個partition對應上了。這之后在hive執行select * from sms_detail where data_date='2015-03-18'時,程序就直接會去'/share/comm/esp/sms/sms_detail/2015-03-18'文件夾下找。2015-03-19的數據也可以按相同的方法加入。