SQL ON Hadoop Hive(三) 分割槽表

2021-09-02 08:05:31 字數 2661 閱讀 4208

分割槽表是將大的表檔案劃分成多個小檔案以利於查詢,但是如果資料分布不均也會影響查詢效率(桶表可以對資料進行雜湊取模,目的是讓資料能夠均勻分布在表的各個資料檔案中,是對分割槽表的補充)

create table info_student(

student_id string,

name string,

age int,

*** string,

father_name string,

mother_name string

)partitioned by (province string,city string);

注意定義分割槽的字段不能和定義表的字段重合,表的分割槽是以表目錄的子目錄存在,執行select *查詢不指定任何字段,hive同樣會將分割槽欄位的資料輸出

對於直接命中分割槽的查詢,hive不會執行mapreduce作業

最常見的分割槽是按照建立時間或者修改時間進行分割槽,所以一張表中的分割槽數目都比較多。如果執行一條包含所有分割槽的查詢將耗費集群巨大的時間和資源,對此可以將hive的安全措施設定為strict,設定後如果乙個針對分割槽表的查詢沒有對分割槽進行限制的話,該作業會被禁止提交

1.可以修改hive-site.xml檔案的hive.mapred.mode配置項為strict   --針對hive的所有會話

2.在hive的命令列set hive.mapred.mode=strict; --僅針對本次會話

show partitions student_info --顯示該錶分割槽情況

--檢視表中特定分割槽

show partitions student_info partition(country='beijing')

注:在hive中預設是使用靜態分割槽,其動態分割槽功能是關閉的,但有時因為業務需求需要動態建立不同分割槽

--利用動態分割槽向表中插入資料(在插入分割槽數量非常多的情況下使用)

--先進行引數設定

set hive.exec.dynamic.partition=true --開啟動態分割槽功能

set hive.exec.dynamic.partition.mode=nostrict --允許所有分割槽都是動態的(分割槽字段可以全為動態指定)hive預設不允許所有分割槽都是動態

--建立動態分割槽表,建表語句與靜態分割槽表相同

insert [overwrite|into] table table_name partition(time) select *,modify_time from source

hive會自動根據modify_time的不同值建立分割槽(依據select最後乙個查詢字段作為動態分割槽依據,而不是依據欄位名,n個動態分割槽欄位-最後n個select欄位作為依據)

動態和靜態分割槽結合,country為靜態分割槽,state為動態分割槽(靜態分割槽必須在動態分割槽之前)

insert overwrite table table_name partition(country='us',state)

select …,se.cnty,se.st

from employees se

where se.cnty='us';

--檢視表基本的分割槽情況

show partitions table_name

--檢視表結構與partitions information

desc table_name partition(day=20160305)

--查詢分割槽對應的location

desc extended table_name partition(day=20160305)

外部分割槽表:與管理表一樣,外部表也是可以有分割槽的,與普通外部表建表語句不同的是,在建表時並沒有指定表的儲存路徑,所以在建立完外部分割槽表後,執行查詢語句時查不到資料的,需要單獨為外部表的分割槽鍵指定值和儲存位置

alter table student_info add partition (province=sichuan,city=chengdu)

location 'hdfs://master:9000/student/sichuan/chengdu'

無論是管理表還是外部表,一旦該錶存在分割槽,那麼資料在載入時必須載入進指定分割槽中

load data inpath '/user/hadoop/data' into student_info partition (province='sichuan',city='chengdu');

insert overwrite table tb_stud partition(clus='20171218') select id,name,age from tb_stud where clus='20171211';

防止分割槽被查詢和被刪除

alter table table_name partition(year=2018,month=12) disable/enable no_drop;

alter table table_name partition(year=2018,month=12) disable/enable offline;

hdu 3400 Line belt 三分套三分)

題意 在乙個二維空間中給出兩條線段ab,cd,線段ab,cd上的運動速度分別為p,q。在這兩條線段之外的空間上運動的速度為r。求從a到d的最短時間。思路 ps 在這種求解方法中,中間運用了比較多的除法,導致精度損失,所以再開方前加乙個eps,防止開方後的值比真實值小。include include ...

三分 三分求極值 HihoCoder 1142

描述 在之前的幾周中我們了解到二分法作為分治中最常見的方法,適用於單調函式,逼近求解某點的值。但當函式是凸形函式時,二分法就無法適用,這時就需要用到三分法。從三分法的名字中我們可以猜到,三分法是對於需要逼近的區間做三等分 week40 2.png 我們發現lm這個點比rm要低,那麼我們要找的最小點一...

HIHOCODER 1142 三分 三分求極值

這一次我們就簡單一點了,題目在此 在直角座標系中有一條拋物線y ax 2 bx c和乙個點p x,y 求點p到拋物線的最短距離d。第1行 5個整數a,b,c,x,y。前三個數構成拋物線的引數,後兩個數x,y表示p點座標。200 a,b,c,x,y 200 第1行 1個實數d,保留3位小數 四捨五入 ...