Hive的两种表

时间:2022-01-09 00:01:31

1.内部表

  • 内部表Load数据有两种方式:① Load data ***;②hdfs dfs -put ****。这是因为在Metastore文件,即mysql的hive数据库的“SDS”表中,保存着Hive表对应的hdfs路径信息。
  • 内部表在Load数据时,如果使用LOCAL关键字,Hive会把本地文件系统中的数据文件复制到Hive的 /warehouse 目录。反之,则是将HDFS上的数据文件剪切到 /warehouse 目录。
  • Hive在Load数据时,并不检查目录中的文件是否符合表所声明的模式。只有通过SELECT查询返回空值NULL,才能确定不匹配。
  • 内部表drop时,表的元数据(mysql中)和数据文件(hdfs中)都会被删除。
create table book (id bigint, name string) row format delimited fields terminated by '\t';

2.外部表

  • 外部表Load数据也有两种方式。
  • 外部表只需在创建表时显示指定表中数据存储位置即可。Hive不会把数据剪切到自己的目录。
  • 实际上,在创建表时,Hive甚至不会检查这一外部位置是否存在。这是一个非常重要的特性,这意味着可以先创建表,再上传数据文件。
  • 如果不显示指定外部表的存放路径,这样Hive将在HDFS上的 /user/hive/warehouse/ 文件夹下创建一个以外部表表名的文件夹,并将属于这个表的数据存放在这里。
  • 对于创建外部表命令,执行成功后,会在hdfs上自动创建空目录'/book'用来存储数据文件。
  • 外部表在drop时,不会碰数据文件,而只会删除元数据信息,即HDFS上的'/book'目录依旧存在。
create external table book (id bigint, name string) row format delimited fields terminated by '\t' location '/book';

区别:

1. 在导入数据到外部表,数据并没有移动到 '/user/hive/warehouse/T_Name'目录下,也就是说外部表中的数据并不是由它自己来管理的!而内部表则不一样;

2. 在删除内部表的时候,Hive将会把属于内部表的元数据和数据文件全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据文件是不会删除的!

3.两种表的选择:推荐使用外部表(跨部门的数据)

4.默认行内分隔符

  • 如果在创建表时没有用row format或stored as子句,那么Hive使用默认格式来分割的每一行。
  • 默认的行内分隔符不是制表符,而是ASCII控制码集合中的Control-A(它的ASCII码为1)
  • 这是因为它出现在文本中的概率相对于制表符来说概率更小。
CREATE TABLE records ( id string ) Row Format Delimited Fields Terminated By ‘\t’ ;

  英语解释:行内格式的限定符以 ' \t '结尾终止