任务描述
本关任务:创建外部表,并导入数据。
相关知识
为了完成本关任务,你需要掌握:1.表的各种操作。
内部表和外部表
Hive 默认创建内部表(managed table),存储位置在 hive.metastore.warehouse.dir 设置,默认位置是 /user/hive/warehouse。导入数据到内部表的时候是将文件剪切(移动)到指定位置,即原有路径下文件不再存在。删除内部表的时候,元数据和 HDFS 对应的目录节点都将被删除。默认创建的就是内部表,语法如下:
create table table_name
(
field1 data_type comment 'a comment',
field2 data_type comment 'a comment',
...
)
row format delimited ## 行分割
fields terminated by',' ## 字段分隔符
lines terminated by'\n' ## 行分隔符
stored as textfile; ## 作为文本存储
案例如:
create table test
(
id int comment 'userID',
a string comment 'userName'
)
row format delimited ## 行分割
fields terminated by' ' ## 字段分隔符
lines terminated by'\n' ## 行分隔符
stored as textfile; ## 作为文本存储
其中 comment 可以省略。后面的几行规定了外部导入文件的数据格式。例如上述要求为:外部数据的组织是行分割,每个字段之间用逗号分割,每一行数据之间用换行符分割,文件格式为 txt。在某名为 data.txt 的外部文件中有以下格式的数据可以被正确导入:
2014001 小王1
2014002 小李2
2014003 小明3
2014004 阿狗4
2014005 姚明5
我们可以从外部文件导入数据,命令如下:
load data local inpath 'data_path' into table table_name;
其中 data_path 是外部文件的路径。
外部表文件可以在外部系统上,只要有访问权限就可以。外部表导入文件时不移动文件,仅仅是添加一个 metadata。删除外部表时,仅元数据被删除,HDFS 对应的目录节点不会被删除。外部表指向的数据发生变化的时候会自动更新,不用特殊处理。创建外部表命令添加一个 external 即可,
即 create external table table_name (xxx);
分辨外部表内部表可以使用 desc formatted table_name;
命令查看。
表操作
进入数据库:use database_name;
查看当前数据库下所有表: show tables;
查看某个数据库下所有表: show tables in db_name;
查看表结构:desc table_name;
向表中插入数据:insert into table_name values(value1,value2,...);
增加一个新列:alter table test add columns (new_column data_type comment 'a comment');
查看表数据:select * from table_name;
创建一张类似表 table_name 结构的表 table_name1:create table table_name1 like table_name;
表的重命名:alter table table_name rename to table_name1;
编程要求
在当前目录下创建一个外部数据文件,其中的内容为:
2014001,小王1
2014002,小李2
2014003,小明3
2014004,阿狗4
2014005,姚明5
创建一张名为 student 的内部表,导入上述外部文件的数据。然后插入以下数据。
2014006,小王6
2014007,小李7
测试说明
平台会对你的操作结果进行测试。
实验过程
打开vi编辑器
vim data.txt
按i在data.txt中加入以下内容
2014001,小王1
2014002,小李2
2014003,小明3
2014004,阿狗4
2014005,姚明5
按esc,输入:wq保存退出
打开hive
hive
输入以下内容
create table student
(
id int ,
a string
)
row format delimited
fields terminated by ','
lines terminated by '\n'
stored as textfile;
load data local inpath '/root/data.txt' into table student;
insert into student values(2014006,"小王6");
insert into student values(2014007,"小李7");
最后进行查询
select * from student;
测试通过