hive1.1.0創建外部表關聯HDFS文件

0. 說明

已經安裝好Hadoop和hive環境,hive把元數據存儲在mysql數據庫。這裏僅討論外部表和HDFS的關聯,而且刪掉外部表以後,對HDFS上的文件沒有影響。mysql


1. 在HDFS建立分區,並存有文件

手工建立或者由程序在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

2. 建立hive外部表(建表語句沒有用location直接關聯HDFS文件)

根據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


3.關聯HDFS文件

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;

4.以後HDFS分區添加新文件,hive會自動關聯

若是這個時候往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)

5. 內部表和外部表相互轉化

能夠經過以下語句轉換外部表和內部表

alter table tablePartition set TBLPROPERTIES ('EXTERNAL'='TRUE');  //內部錶轉外部表

alter table tablePartition set TBLPROPERTIES ('EXTERNAL'='FALSE');  //外部錶轉內部表

6. 建外部表時指定HDFS路徑(建表語句沒有用location直接關聯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 添加分區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)