5.7 Hive 内部表
Hive内部表与数据库中的Table在概念上是类似。
- 每一个Table在Hive中都有一个相应的目录存储数据。例如,一个表test,它在HDFS中的路径为:$/warehouse/test。warehouse是在hive-site.xml中由${hive.metastore.warehouse.dir}指定的数据仓库的目录
- 所有的Table数据(不包括External Table)都保存在这个目录中。
- 删除表时,元数据与数据都会被删除
创建内部表
create table t_managed_table(id int);
这种方式创建的表就是内部表。由于HIVE是数据仓库工具,因此其并没有插入的命令,只有批量导入数据的命令。
hive> create table t_managed_table(id int);
OK
Time taken: 1.483 seconds
hive> LOAD DATA LOCAL INPATH '/home/hadoop/1.txt' INTO TABLE t_managed_table;
Loading data to table default.t_managed_table
OK
Time taken: 2.574 seconds
hive> select * from t_managed_table;
OK
1
2
3
4
5
6
7
8
9
10
Time taken: 2.97 seconds, Fetched: 10 row(s)
在这里,id.txt中的内容会被导入到t_managed_table的id列。虽然我们并没有指定数据导入到哪一列,但是因为t_managed_table中只有一个列id,所以id.txt中的数据只能导入到这一列中。
此时我们在控制台上,可以看到说明;
对于命令LOAD DATA LOCAL INPATH '/tmp/root/id.txt' INTO TABLE t_managed_table;
如果包含LOCAL,则意味着我们导入的数据是从本地,因此导入的数据文件要填写本地文件的路径
如果不包含LOCAL,则意味着我们要从HDFS中导入数据,填写的路径应该是HDFS中的路径。
多列的内部表
CREATE TABLE multi_clumns_table(id int,name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
这个语句的意思是,以制表符"\t"来区分数据文件中不同的列。所以当我们导入数据的时候,我们的数据文件中也需要用制表符。
准备数据文件2.txt
1 tianshouzhi
2 wangxiaoxiao
3 wanghanao
4 huhuamin
5 luyang
导入数据
hive> LOAD DATA LOCAL INPATH '/home/hadoop/2.txt' INTO TABLE multi_clumns_table;
Loading data to table default.multi_clumns_table
OK
Time taken: 8.806 seconds
hive> select * from multi_clumns_table;
OK
1 tianshouzhi
2 wangxiaoxiao
3 wanghanao
4 huhuamin
5 luyang
Time taken: 2.414 seconds, Fetched: 5 row(s)
注意,HIVE在查询的时候,除了select * from 表名不需要走map/reduce之外,其他的语句都要走map/reduce。因为select * 表示的是全表扫描,全表扫描实际上就是获取HDFS文件中所有内容。