已經安裝好Hadoop和hive環境,hive把元數據存儲在mysql數據庫。這裏僅討論外部表和HDFS的關聯,而且刪掉外部表以後,對HDFS上的文件沒有影響。mysql
手工建立或者由程序在HDFS上生成了分區目錄,每一個分區目錄下有相應的文件。本例中根據day分了兩個分區,以下所示:sql
/test/in/day=20/20.txt /test/in/day=21/21.txt
文件裏面的內容格式以下:數據庫
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;Xizang
根據HDFS上的源文件裏面的數據格式,建立hive外部表。oop
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裏面分號是特殊符號(命令執行結束符),若是建表語句裏面用分號則會出錯,使用分號的ascii碼'\073'(這裏用了八進制碼)則正常。code
查看t3的表結構:orm
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)
表格已經成功建立。blog
hive並不會自動關聯hdfs中指定目錄的partitions目錄,須要手工操做。
經過給已經建立的表增長分區數據的方式,與HDFS上的文件相互關聯起來。
語法格式:hadoop
alter table 表名稱 add partition (分區名1=分區值1,...) location 'HDFS上的文件的路徑';
關聯day=20的分區:ci
hive> alter table t3 add partition (day=20) location '/test/in/day=20/20.txt'; OK
關聯day=21的分區:string
hive> alter table t3 add partition (day=21) location '/test/in/day=21/21.txt'; OK
執行下面命令,查看錶格能夠發現數據已經導入。
hive> select * from t3;
若是這個時候往HDFS上面的分區增長一個文件(符合t3表格式),hive表也能夠自動讀取到並添加數據。
如新建一個文件b.txt,內容是:1101;JayFEF;2095;BBBB
上傳到HDFS的day=21分區:
hadoop fs -put /jaydisk/b.txt /test/in/day=21
直接查看錶格,能夠看到新的數據也已經添加進去。
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)
能夠經過以下語句轉換外部表和內部表
alter table tablePartition set TBLPROPERTIES ('EXTERNAL'='TRUE'); //內部錶轉外部表 alter table tablePartition set TBLPROPERTIES ('EXTERNAL'='FALSE'); //外部錶轉內部表
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';
alter table t1 add partition (day=20);
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)