知识梳理:
创建表的时候没有external的是内部表,有external的是内部表
内部表删除会删除元数据以及存储数据,外部表仅删除元数据
内部表默认位置/user/hive/warehouse,外部表位置自己设定
内部表:
1.进入hive,查看存在的数据库,使用其中的一个数据库,在其中显示已经存在的表,然后创建一个新表(表名word)
2.在本地创建一个文件,内容如下:(红框中是tab键所得)
3.往数据库word表中插入信息
方法一:格式:insert into [表名] values('字段一','字段二'.....) 【提示:这里的字段要和上边创建时候的字段对应】
命令:insert into word values('hello',1);
【不建议使用此方法,原因每次向表中插入数据都会调用mapreduce,而且过程相对较慢】
3.1.1.在hive下查看数据信息,如下表示查看插入成功:
3.1.2.在hdfs下查看数据信息,会在默认位置下,看到多处两个信息,一个是创建的表,一个是插入的信息
3.1.3.查看插入的信息,如下:
3.1.4.查看mysql数据库中的信息如下:(多出一个新创建的表,类型是内部表)
进入mysql --> show databases; --->use 数据库名;(安装hive的时候创建的数据库名) --->select * from TBLS;
3.1.5.删除hdfs中上传的信息(3.1.2中查看的插入的文件的路径)
3.1.6.查看hive下的word表中的信息,为空
3.1.7.删除word表
3.1.8.查看MySQL数据库中,以及hdfs下有关表的信息都被清空
方法二:使用load方法加载数据
3.2 本地文件hive_test_tab的内容如下:
3.2.1 格式:load data [local] inpath '本地路径' into table 表名; [如果文件在本地,需要加 local ]
命令:load data local inpath '/home/hadoop/hive_test_tab' into table word;
【用这种方法会出现下面所示,现实的内容会有NULL】
3.2.2 余下操作和方法一中的一样(3.1.2 -- 3.1.8)
【解决方法】如果想要得到和输入的内容一样的格式(就是输出没有NULL),可采用如下的方法创建表:
row,fields这两行是对需要加载的文件的分隔符的设置,本文需要加载的文件hive_test_tab,内容中间使用的是制表符分割,所以这里使用\t
3.2.3 然后再使用load方法将数据上传到表中
命令:load data local inpath '/home/hadoop/hive_test_tab' into table word;
在查看表的信息,就没有NULL,如下:
3.2.4 余下操作和方法一中的一样(3.1.2 -- 3.1.8)
方法三:使用hdfs命令
格式:hdfs dfs -put 本地文件名 hdfs下创建的表的路径
3.3.1 创建表
3.3.2 查看hdfs下表的位置
其中hive_test_tab是在本地创建的一个文件,上边也有(方法二中的3.2)
3.3.3 查看hive下的表中的信息,如下:
【如果不想要里面的NULL,可以在创建表的时候使用格式,如3.2.2 中的解决方法】
3.3.4 余下操作和方法一中的一样(3.1.2 -- 3.1.8)
外部表:
在hive中创建外部表,创建方式和内部表相似,但是多了一个external(外部表的象征),后面多一个location,
其中的“/database/” 为上传的文件在hdfs下的目录名
(该文章的文件在hdfs下的位置是/database/hive_test_tab,所以是"/database/")
【提示:如果创建表的时候没有中间row,fields那两行在结果查询中也会出现NULL,上边有提到】
如果想要去hdfs下查看数据是否成功传入,但是不知道位置,可以使用一下命令查看位置,还能查看表的有关信息
删除外部表
此时在hive下,还有mysql中都没有外部表的信息,但是hdfs下查看仍然有外部表存在,查看文件内容,仍然显示信息
(原因:删除外部表只删除元数据,不删除存储数据,这也是内部表与外部表的不同之一)