1. 파티션


   큰 규모에 데이터를 물리적으로 나누어서 성능을 개선하고자 하는 역할로 파티션을

   사용함


   create [external] table [if not exists] [database_name.]table_name

      [(column_name data_type [ COMMENT column_comment], ...)]

      [PARTITIONED BY (column_name data_type [COMMENT column_comment], ...)];



   1) partitioning a managed table


       - conutry 기준 파티션

       create table customer

       (

           id      string,

           name string,

           sex    string,

           state  string

       ) partitoned by (country string);


       생성시 디렉토리 구조

        /usr/hive/warehause 

                                    /test.db

                                                /customer 

                                                              /country=KR


       

       - conutry, state 기준 파티션

       create table customer

       (

           id      string,

           name string,

           sex    string

       ) partitoned by (country string);


      * 파티션키는 table 컬럼에 포함시키지 못함.


       생성시 디렉토리 구조

        /usr/hive/warehause 

                                    /test.db

                                                /customer 

                                                              /country=KR

                                                                                /state=TB




     hive> set hive.mapred.mode=strict;

     hive> select * from customer;       --- strict모드에서는 table full scan이 안됨


     hive> set hive.mapred.mode=nonstrict;

     hive> select * from customer;  


     hive> show partitions customer    --- 파티션 테이블 정보 all list

             show partitions customer partition(country = 'KR')   -- 해당 country 


     hive> describe customer             --- 파티션 테이블 컬럼 정보 출력

      


     -- ALTER 구문

     alter table table_name add [IF NOT EXISTS] PARTITION partition_spec

            [LOCATION 'loc1'] partition_spec [LOCATION 'loc2'] ...;

     partiton_spec:

           : (partition_column = partition_column_value, partition_column = partition_colum_value, ...)


     alter table test add partition (dt='20160530') location '/test/20160530'



     -- RENAME 구문

     alter table table_name PARTITION partition_spec RENAME TO partition partition_spec;


     -- EXCHANGE 구문

     alter table tablen1 exchange partition (partition_spec) with table tablen2;

     ex) alter table tablen1 exchange partition (ct='1') with table tablen2;

          (table@ct=1 테이블이 없어야 하고, tablen1과 tablen2 구조가 같아야 함)


     -- DROP 구문

     alter table tablen1 drop [if exists] partition partition_spec[, partition partition_spec, ...][ignore protection][purge];


     -- LOAD 구문

     load data [local] inpath 'filepath' [overwrite] into table tablename 

          [partition (partcolumn1=v1, partcolum2=v2 ...)]

     

     -- INSERT 구문

     insert overwrite table tablename [ partition (partcolumn1=v1, ...)]

                                                                select ........  from tablename;

     insert into table tablename [ partition (partcolumn=v1

                                                                select ........  from tablename;


     * dynamic partition을 사용할때문 insert구문에서 partiotn 컬럼만 정의해서 사용

       set hive.exec.dynamic.partition = true;

       set hive.exec.dynamic.partition.mode = nonstrict;


 

 2) partitioning an external table

    파티션을 삭제할때 data file이 삭제 되지 않을것을 제외하고 managed랑 동일


       create external table customer

       (

           id      string,

           name string,

           sex    string,

           state  string

       ) partitoned by (country string);

    

       -- ALTER 구문

       alter table customer add partition(country='US') location '/user/hive/~~~'


       -- refresh to add new partition

       msck repair table test;


  3) Bucketing

     파티션키를 unique한 컬럼을 선택하면 파티션 개수가 많아져서 잘 동작하지 않는

     문제를 해결하기 위해 특정 개수만큼 지정할수 있도록 제공해 주는 기능 (hash)

 

     Bucket number = hash_function(bucketing_column) mod num_buckets


     set hive.enforce.bucketing=true (default : false)


     create [external] table [db_name.]tablename 

         [(col_name datatype [comment col_comment], ...)]

         clustered by (col_name datatype [comment col_comment], ...)

     into n buckets;


     * clustered by 파티션키 정의

     

       create table customer_bucket

       (

           id      string,

           name string,

           sex    string,

           state  string

       ) clustered by (id) into 10 buckets;


       insert into   customer_bucket select * from customer;


      * bucket 방식에 파티션 테이블은 파티션 컬럼이 파티션 테이블에 포함 가능하며,

        load data는 사용할수 없으므로 insert 구문을 사용하면 됨.

'NoSQL > Hive' 카테고리의 다른 글

Hive 구성  (0) 2016.06.13
Hive metastore  (0) 2016.06.13
Hive 구성  (0) 2016.06.10
Hive Data Types  (0) 2016.06.09
Troubleshooting hive  (0) 2016.06.08

+ Recent posts