1.分區apache
分區是以字段的形式在表結構中存在,經過describe table命令能夠查看到字段存在, 可是該字段不存放實際的數據內容,僅僅是分區的表示(僞列)。ide
(1)靜態分區 create table if not exists sopdm.wyp2(id int,name string,tel string) partitioned by(age int) row format delimited fields terminated by ',' stored as textfile;oop
--overwrite是覆蓋,into是追加 insert into table sopdm.wyp2 partition(age='25') select id,name,tel from sopdm.wyp;ui
(2)動態分區 --設置爲true表示開啓動態分區功能(默認爲false) set hive.exec.dynamic.partition=true; --設置爲nonstrict,表示容許全部分區都是動態的(默認爲strict) set hive.exec.dynamic.partition.mode=nonstrict;orm
--insert overwrite是覆蓋,insert into是追加 set hive.exec.dynamic.partition.mode=nonstrict; insert overwrite table sopdm.wyp2 partition(age) select id,name,tel,age from sopdm.wyp;索引
CREATE TABLE bucketed_user (id INT) name STRING) CLUSTERED BY (id) INTO 4 BUCKETS;hadoop
對於每個表(table)或者分區, Hive能夠進一步組織成桶,也就是說桶是更爲細粒度的數據範圍劃分。Hive也是 針對某一列進行桶的組織。Hive採用對列值哈希,而後除以桶的個數求餘的方式決定該條記錄存放在哪一個桶當中。 把表(或者分區)組織成桶(Bucket)有兩個理由: (1)得到更高的查詢處理效率。桶爲表加上了額外的結構,Hive 在處理有些查詢時能利用這個結構。具體而言,鏈接兩個在(包含鏈接列的)相同列上劃分了桶的表,能夠使用 Map 端鏈接 (Map-side join)高效的實現。好比JOIN操做。對於JOIN操做兩個表有一個相同的列,若是對這兩個表都進行了桶操做。那麼將保存相同列值的桶進行JOIN操做就能夠,能夠大大較少JOIN的數據量。 (2)使取樣(sampling)更高效。在處理大規模數據集時,在開發和修改查詢的階段,若是能在數據集的一小部分數據上試運行查詢,會帶來不少方便。開發
3.索引string
索引能夠加快含有group by語句的查詢的計算速度it
create index employees_index on table employees(country) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild in table employees_index_table ;