1. 程式人生 > >hive開發中對分割槽的各種操作詳解

hive開發中對分割槽的各種操作詳解

    hive開發中,在儲存資料時,為了更快地查詢資料和更好地管理資料,都會對hive表中資料進行分割槽儲存。所謂的分割槽,在hive表中體現的是多了一個欄位。而在底層檔案儲存系統中,比如HDFS上,分割槽則是一個資料夾,或者說是一個檔案目錄,不同的分割槽,就是資料存放在根目錄下的不同子目錄裡。1.查看錶的分割槽以及分割槽結構

    表的分割槽欄位一般都是在建表的時候就已經設定好了。當然給表刪除和增加分割槽前首先要知道表中分割槽有哪些,有沒有分割槽,分割槽的欄位有哪些?可以使用如下命令來查看錶中的所有分割槽。

   hive (fdm_sor)> show partitions mytest_tmp;
                   OK
                  partition 

說明:如果表裡沒有新增資料的話,是不會顯示具體分割槽欄位名的,要想知道表中具體分割槽欄位名,可用describe formatted table_name

此外,show partitions FDM_SOR.mytest_deptaddr partition(statis_date='20180303'),可以檢視指定分割槽 

2.給表增加刪除分割槽  

 語法結構([]括號內屬於可選的配置)
ALTER TABLE table_name ADD [IF NOT EXISTS] partition_spec [ LOCATION 'location1' ] partition_spec [ LOCATION 'location2' ] ...
partition_spec:
: PARTITION (partition_col = partition_col_value, partition_col = partiton_col_value, ...)
ALTER TABLE table_nameDROPpartition_spec, partition_spec,...


具體例項演示:給表增加分割槽

hive (fdm_sor)> alter table mytest_tmp add partition(statis_date='20180304');
OK

1.給表增加或者刪除分割槽,前提建立表時已經定義了分割槽欄位statis_date.否則增加不了分割槽。同理在建表時定義分割槽欄位,才可以drop分割槽,否則會報錯。

2.如果給外部表(external table)增加分割槽時,要制定location。即儲存位置。

  alter table abc add partiton(year='2018',moth='03') location 'hdfs://user/data/2018/03'

hive (fdm_sor)> show partitions mytest_tmp;
OK
partition
statis_date=20180304

在給表刪除分割槽時,要注意,如果刪除一個不存在的分割槽,並不會報錯,如下刪除一個不存在的分割槽。

hive (fdm_sor)> alter table mytest_tmp drop  partition(statis_date='2018030005');
OK

3.建立表時給表新增分割槽欄位

CREATE  TABLE `FDM_SOR.mytest_deptaddr`(  
      `dept_no` int,   
      `addr` string,   
      `tel` string)
 partitioned by(statis_date string,location string  ) 
 ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 

上面建表時,給表增加了分割槽,而且分割槽欄位是兩個欄位。在hdfs上面的表現就是statis_date資料夾下還有一個子資料夾location.多個分割槽欄位,相當於多層檔案目錄。

4.關於分割槽的表操作的注意事項

  1. 一般來說,查詢分割槽表時,一定會在where子句中加上分割槽條件,指明檢視哪個分割槽的資料。否則會報錯。因為預設set hive.mapred.mode=strict.即嚴格模式。如果set hive.mapred.mode=nostrict.可以查詢分割槽表時不帶分割槽宣告,這個時候會返回整張表的所有資料。

  2.往分割槽表中load資料或者匯出資料時,要指定分割槽。

 load data local inpath'/home/robot/111.txt'

 overwrite into table  FDM_SOR.mytest_deptaddr partition(statis_date='20180228')