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)