1. 非分区表 (1)load 加载数据 本地文本文件a.txt中有一行'aaa',执行下面的命令。
代码语言:javascript复制CREATE TABLE t1 (name STRING);
LOAD DATA LOCAL INPATH '/home/grid/a.txt' INTO TABLE t1;
SELECT * FROM t1;
dfs -ls /user/hive/warehouse/test.db/t1;
执行命令及结果如图1所示。
图1 可以看到,向表中加载了数据'aaa',生成了数据文件/user/hive/warehouse/test.db/t1/a.txt 在a.txt中添加一行'bbb',然后在执行下面的命令。
代码语言:javascript复制LOAD DATA LOCAL INPATH '/home/grid/a.txt' INTO TABLE t1;
SELECT * FROM t1;
dfs -ls /user/hive/warehouse/test.db/t1;
执行命令及结果如图2所示。
图2 可以看到,现在表中有三条数据,新生成了数据文件/user/hive/warehouse/test.db/t1/a_copy_1.txt。 (2)load overwrite 加载数据 执行下面的命令。
代码语言:javascript复制CREATE TABLE t2 (name STRING);
LOAD DATA LOCAL INPATH '/home/grid/a.txt' OVERWRITE INTO TABLE t2;
SELECT * FROM t2;
dfs -ls /user/hive/warehouse/test.db/t2;
执行命令及结果如图3所示。
图3 可以看到,现在表中有两条数据,生成了数据文件/user/hive/warehouse/test.db/t2/a.txt 编辑a.txt,使其只有一行'ccc',然后在执行下面的命令。
代码语言:javascript复制LOAD DATA LOCAL INPATH '/home/grid/a.txt' OVERWRITE INTO TABLE t2;
SELECT * FROM t2;
dfs -ls /user/hive/warehouse/test.db/t2;
执行命令及结果如图4所示。
图4 可以看到,现在表中只有一条数据'ccc',数据文件名没变,但其内容重新生成。 (3)删除表
代码语言:javascript复制drop table t1;
drop table t2;
show tables;
dfs -ls /user/hive/warehouse/test.db;
执行命令及结果如图5所示。
图5 可以看到,表数据目录已经被删除。 对于外部表,除了删除表只删除元数据而保留表数据目录外,数据加载行为与内部表相同。 2. 分区表 (1)load 加载数据 本地文本文件a.txt中有一行'aaa',执行下面的命令。
代码语言:javascript复制CREATE TABLE t1 (name STRING) PARTITIONED BY (country STRING, state STRING);
LOAD DATA LOCAL INPATH '/home/grid/a.txt' INTO TABLE t1 PARTITION (country = 'US', state = 'CA');
SELECT * FROM t1;
dfs -ls /user/hive/warehouse/test.db/t1/country=US/state=CA;
执行命令及结果如图6所示。
图6 可以看到,向表中加载了数据'aaa',生成了数据文件/user/hive/warehouse/test.db/t1/country=US/state=CA/a.txt (2)load overwrite 加载数据(与非分区表类似,实验略) (3)alter table add partition 加载数据 执行下面的命令。
代码语言:javascript复制SELECT * FROM t1;
ALTER TABLE t1 ADD PARTITION(country = 'US', state = 'CB') LOCATION '/a';
dfs -cp /user/hive/warehouse/test.db/t1/country=US/state=CA/a.txt /a;
dfs -ls /a;
SELECT * FROM t1;
dfs -rm /user/hive/warehouse/test.db/t1/country=US/state=CA/a.txt;
SELECT * FROM t1;
执行命令及结果如图7所示。
图7 说明:表中原有一条数据'aaa'。添加一个新分区,并指定位置为'/a'。把已经存在的数据文件a.txt复制到目录'/a'里。此时查询表已经有属于不同分区的两条数据。删除country = 'US', state = 'CA'分区的数据文件。此时查询表只有属于country = 'US', state = 'CB'分区的一条数据。 (4)删除数据表
代码语言:javascript复制dfs -ls /user/hive/warehouse/test.db;
dfs -ls /;
drop table t1;
show tables;
dfs -ls /user/hive/warehouse/test.db;
dfs -ls /;
执行命令及结果如图8所示。
图8 可以看到,表数据目录已经被删除。 对于外部表,除了删除表只删除元数据而保留表数据目录外,数据加载行为与内部表相同。 总结: 1. load与load overwrite的区别是: load 每次执行生成新的数据文件,文件中是本次加载的数据。 load overwrite如表(或分区)的数据文件不存在则生成,存在则重新生成数据文件内容。 2. 内部表与外部表的区别是(无论是否分区): 删除表时,内部表会删除表的元数据和表数据目录,外部表只会删除元数据而保留数据目录。 3. 分区表比非分区表多了一种alter table ... add partition的数据加载方式。 4. 对于分区表(无论内部还是外部),load与load overwrite会自动建立名为分区键值的目录,而alter table ... add partition,只要用location指定数据文件所在的目录即可。