Hive 外部表关联分区数据
0. 說明
已經(jīng)安裝好Hadoop和hive環(huán)境,hive把元數(shù)據(jù)存儲在mysql數(shù)據(jù)庫。這里僅討論外部表和HDFS的關(guān)聯(lián),并且刪掉外部表之后,對HDFS上的文件沒有影響。
1. 在HDFS創(chuàng)建分區(qū),并存有文件
手工創(chuàng)建或者由程序在HDFS上生成了分區(qū)目錄,每個(gè)分區(qū)目錄下有相應(yīng)的文件。本例中根據(jù)day分了兩個(gè)分區(qū),如下所示:
/test/in/day=20/20.txt /test/in/day=21/21.txt文件里面的內(nèi)容格式如下:
2;Lily;1991;Shanghai 3;Jack;1992;Guangxi 4;Jenny;1999;Xinjiang 5;Jay;1995;Xizang 6;Tom;1990;Beijing 7;Lily;1991;Shanghai 8;Jack;1992;Guangxi 9;Jenny;1999;Xinjiang 10;Jay;1995;Xizang2. 創(chuàng)建hive外部表(建表語句沒有用location直接關(guān)聯(lián)HDFS文件)
根據(jù)HDFS上的源文件里面的數(shù)據(jù)格式,創(chuàng)建hive外部表。
hive> create external table t3 (seq int,name string,year int, city string)> partitioned by (day int)> row format delimited> fields terminated by '\073'> stored as textfile; OK Time taken: 0.207 seconds源文件里面列之間的分隔符是分號,hive里面分號是特殊符號(命令執(zhí)行結(jié)束符),如果建表語句里面用分號則會出錯(cuò),使用分號的ascii碼'\073'(這里用了八進(jìn)制碼)則正常。
查看t3的表結(jié)構(gòu):
hive> desc t3; OK seq int name string year int city string day int# Partition Information # col_name data_type comment day int Time taken: 0.079 seconds, Fetched: 10 row(s)表格已經(jīng)成功創(chuàng)建。
3.關(guān)聯(lián)HDFS文件
hive并不會自動關(guān)聯(lián)hdfs中指定目錄的partitions目錄,需要手工操作。
通過給已經(jīng)創(chuàng)建的表增加分區(qū)數(shù)據(jù)的方式,與HDFS上的文件相互關(guān)聯(lián)起來。
語法格式:
關(guān)聯(lián)day=20的分區(qū):
hive> alter table t3 add partition (day=20) location '/test/in/day=20/20.txt'; OK關(guān)聯(lián)day=21的分區(qū):
hive> alter table t3 add partition (day=21) location '/test/in/day=21/21.txt'; OK執(zhí)行下面命令,查看表格可以發(fā)現(xiàn)數(shù)據(jù)已經(jīng)導(dǎo)入。
hive> select * from t3;4.之后HDFS分區(qū)添加新文件,hive會自動關(guān)聯(lián)
如果這個(gè)時(shí)候往HDFS上面的分區(qū)增加一個(gè)文件(符合t3表格式),hive表也可以自動讀取到并添加數(shù)據(jù)。
如新建一個(gè)文件b.txt,內(nèi)容是:1101;JayFEF;2095;BBBB
上傳到HDFS的day=21分區(qū):
hadoop fs -put /jaydisk/b.txt /test/in/day=21直接查看表格,可以看到新的數(shù)據(jù)也已經(jīng)添加進(jìn)去。
hive> select * from t3; OK 2 Lily 1991 Shanghai 20 3 Jack 1992 Guangxi 20 4 Jenny 1999 Xinjiang 20 5 Jay 1995 Xizang 20 6 Tom 1990 Beijing 20 7 Lily 1991 Shanghai 20 8 Jack 1992 Guangxi 20 9 Jenny 1999 Xinjiang 20 10 Jay 1995 Xizang 20 1101 JayFEF 2095 BBBB 21 Time taken: 1.549 seconds, Fetched: 19 row(s)5. 內(nèi)部表和外部表相互轉(zhuǎn)化
可以通過如下語句轉(zhuǎn)換外部表和內(nèi)部表
alter table tablePartition set TBLPROPERTIES ('EXTERNAL'='TRUE'); //內(nèi)部表轉(zhuǎn)外部表alter table tablePartition set TBLPROPERTIES ('EXTERNAL'='FALSE'); //外部表轉(zhuǎn)內(nèi)部表6. 建外部表時(shí)指定HDFS路徑(建表語句沒有用location直接關(guān)聯(lián)HDFS文件)
6.1 建表
create external table t1 (seq int,name string,year int, city string) partitioned by (day int) row format delimited fields terminated by '\073' stored as textfile location '/test/in';6.2 添加分區(qū)day=20
alter table t1 add partition (day=20);6.3 查看成功
hive> select * from t1; OK 2 Lily 1991 Shanghai 20 3 Jack 1992 Guangxi 20 4 Jenny 1999 Xinjiang 20 5 Jay 1995 Xizang 20 6 Tom 1990 Beijing 20 7 Lily 1991 Shanghai 20 8 Jack 1992 Guangxi 20 9 Jenny 1999 Xinjiang 20 10 Jay 1995 Xizang 20 Time taken: 0.108 seconds, Fetched: 9 row(s)總結(jié)
以上是生活随笔為你收集整理的Hive 外部表关联分区数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ros(7)自定义service数据
- 下一篇: F5 BIGip 负载均衡 IP算法解密