因?yàn)橛胢r對(duì)hdfs進(jìn)行操作比較繁瑣盗迟,所以才出現(xiàn)了hive坤邪。hive本質(zhì)上進(jìn)行操作的還是hdfs文件,而不是表诈乒。所以在一些地方罩扇,為了迎合hdfs文件,與sql語(yǔ)言有些許的不同怕磨。比如在建表方面的不同喂饥,在一些函數(shù)上的不同等。
一肠鲫、hive 建表
參考:Hive學(xué)習(xí)3:Hive三種建表語(yǔ)句詳解
1.1员帮、直接建表法:
在建表時(shí),要通過語(yǔ)法导饲,將HDFS上的文件映射成表結(jié)構(gòu)捞高。所以在建表時(shí)與sql上有些許不同。
不過渣锦,建立好表以后硝岗,已經(jīng)映射成表結(jié)構(gòu),那么操作就跟sql很相似了袋毙。
1.1.1型檀、row format 與 file format
row format
其中,映射過程中會(huì)有參數(shù)row format(行的格式) 和 file format(文件的格式) 兩個(gè)參數(shù)听盖。
row format 表示的是行在存儲(chǔ)時(shí)的序列化 與 反序列化 的規(guī)則胀溺。一般后面都是定好了默認(rèn)參數(shù)的。需要的時(shí)候再改皆看。
比如仓坞,給表定好了,列按照逗號(hào)分割腰吟,某個(gè)字段按照“-”分割无埃,map型字段按照“:”分割。
這樣訂好了形式以后毛雇,就能夠讓系統(tǒng)比較合理的進(jìn)行序列化與反序列化了
file format
表示hdfs文件存放的格式录语,默認(rèn)是TEXTFILE,文本格式禾乘,可以直接打開。
按照參考的網(wǎng)頁(yè)虽缕,建表始藕。注意蒲稳,建表的時(shí)候,已經(jīng)指明了各個(gè)字段的類型伍派,所以在進(jìn)行分割的時(shí)候就很容易了江耀。
create table t1(
id int
,name string
,hobby array<string>
,add map<String,string>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
;
元數(shù)據(jù)的概念:
參考:Hive的數(shù)據(jù)存儲(chǔ)
元數(shù)據(jù),是用來描述數(shù)據(jù)的數(shù)據(jù)诉植。 表中的數(shù)據(jù)祥国,比如,25,31是數(shù)據(jù)晾腔。而元數(shù)據(jù)中舌稀,元數(shù)據(jù)“年齡”就是用來描述25,31的。所以說灼擂,元數(shù)據(jù)是這種用來描述數(shù)據(jù)的數(shù)據(jù)壁查。
在hive中
元數(shù)據(jù)是用來存儲(chǔ)表的名字,表的列和分區(qū)及其屬性剔应,表的屬性(是否為外部表等)睡腿,表的數(shù)據(jù)所在目錄等。
Hive中的元數(shù)據(jù)包括表的名字峻贮,表的列和分區(qū)及其屬性席怪,表的屬性(是否為外部表等),表的數(shù)據(jù)所在目錄等纤控。 由于Hive的元數(shù)據(jù)需要不斷的更新挂捻、修改,而HDFS系統(tǒng)中的文件是多讀少改的嚼黔,這顯然不能將Hive的元數(shù)據(jù)存儲(chǔ)在HDFS中细层。目前Hive將元數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,如Mysql唬涧、Derby中疫赎。
1.1.2、external
未被external修飾的是內(nèi)部表(managed table)碎节,被external修飾的為外部表(external table)
區(qū)別:
- 內(nèi)部表數(shù)據(jù)由Hive自身管理捧搞,
外部表數(shù)據(jù)由HDFS管理; - 內(nèi)部表數(shù)據(jù)存儲(chǔ)的位置是hive.metastore.warehouse.dir(默認(rèn):/user/hive/warehouse)狮荔,
外部表數(shù)據(jù)的存儲(chǔ)位置由自己制定胎撇; - 刪除內(nèi)部表會(huì)直接刪除元數(shù)據(jù)(metadata)及存儲(chǔ)數(shù)據(jù);
刪除外部表僅僅會(huì)刪除元數(shù)據(jù)殖氏,HDFS上的文件并不會(huì)被刪除晚树; - 對(duì)內(nèi)部表的修改會(huì)將修改直接同步給元數(shù)據(jù),
而對(duì)外部表的表結(jié)構(gòu)和分區(qū)進(jìn)行修改雅采,則需要修復(fù)(MSCK REPAIR TABLE table_name;)
建立外部表(這里t2 被external所修飾了)
'''
create external table t2(
id int
,name string
,hobby array<string>
,add map<String,string>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
location '/user/t2'
;
'''
1.2爵憎、查詢建表法:
將子查詢的結(jié)果存在新表里慨亲,表中有數(shù)據(jù)。通過as查詢語(yǔ)句完成建表宝鼓。
例子:
create table t3 as
select
id
,name
from t2
;
1.3刑棵、like建表法
創(chuàng)建結(jié)構(gòu)完全相同的表,但是沒有數(shù)據(jù)愚铡。
例子:
create table t4 like t2;