原创

hive 表数据加载、表删除试验

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://wxy0327.blog.csdn.net/article/details/50804084
1. 非分区表
(1)load 加载数据
本地文本文件a.txt中有一行'aaa',执行下面的命令。
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',然后在执行下面的命令。
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 加载数据
执行下面的命令。
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',然后在执行下面的命令。
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)删除表
drop table t1;
drop table t2;
show tables;
dfs -ls /user/hive/warehouse/test.db;

执行命令及结果如图5所示。


图5
可以看到,表数据目录已经被删除。

对于外部表,除了删除表只删除元数据而保留表数据目录外,数据加载行为与内部表相同。

2. 分区表
(1)load 加载数据
本地文本文件a.txt中有一行'aaa',执行下面的命令。
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 加载数据
执行下面的命令。
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)删除数据表
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指定数据文件所在的目录即可。
文章最后发布于: 2016-03-04 17:14:51
展开阅读全文
0 个人打赏
私信求帮助

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览