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

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指定数据文件所在的目录即可。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值