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

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

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

3. 总结

  • load 与 load overwrite 的区别是:load 每次执行生成新的数据文件,文件中是本次加载的数据;load overwrite 如表(或分区)的数据文件不存在则生成,存在则重新生成数据文件内容。
  • 内部表与外部表的区别是(无论是否分区):删除表时,内部表会删除表的元数据和表数据目录;外部表只会删除元数据而保留数据目录。
  • 分区表比非分区表多了一种 alter table ... add partition 的数据加载方式。
  • 对于分区表(无论内部还是外部),load 与 load overwrite 会自动建立名为分区键值的目录,而 alter table ... add partition,只要用 location 指定数据文件所在的目录即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值