1.内部表
- 内部表在LOAD数据时,如果使用LOCAL关键字,Hive会把本地文件系统中的数据文件复制到Hive的 /warehouse 目录。反之,则是将HDFS上的数据文件剪切到 /warehouse 目录。
- Hive在LOAD数据时,并不检查目录中的文件是否符合为表所声明的模式。只有通过SELECT查询返回空值NULL,才能确定不匹配。
- 内部表删除时,表的元数据(mysql中)和数据文件(hdfs中)都会被删除。
create table book (id bigint, name string) row format delimited fields terminated by ‘\t‘;
2.外部表
- 外部表:只需在创建表时显示的指定表中数据的存储位置即可。Hive不会把数据剪切到自己的目录。
- 实际上,在创建表时,Hive甚至不会检查这一外部位置是否存在。这是一个非常重要的特性,因为这意味着可以先创建表,再上传数据文件。
- 如果不显示指定外部表的存放路径,这样Hive将在HDFS上的 /user/hive/warehouse/ 文件夹下创建一个以外部表表名的文件夹,并将属于这个表的数据存放在这里
- 对于以下命令,执行成功后,会在hdfs上自动创建空目录‘/book‘用来存储数据文件。
- 外部表在删除表时,不会碰数据文件,而只会删除元数据信息,即HDFS上的‘/book‘目录依旧存在。
create external table book (id bigint, name string) row format delimited fields terminated by ‘\t‘ location ‘/book‘;
最后归纳两种表的区别:
- 在导入数据到外部表,数据并没有移动到 ‘/user/hive/warehouse/T_Name‘目录下,也就是说外部表中的数据并不是由它自己来管理的!而内部表则不一样;
- 在删除内部表的时候,Hive将会把属于内部表的元数据和数据文件全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据文件是不会删除的!
3.两种表的选择
- 所有的处理都由Hive完成,应该使用内部表。
- Hive和其他工具共同处理同一数据集,或者,为同一个数据集关联不同的模式使用外部表。
4.存储格式
- 如果在创建表时没有用row format或stored as子句,那么Hive使用默认格式来分割的每一行。
- 默认的行内分隔符不是制表符,而是ASCII控制码集合中的Control-A(它的ASCII码为1)
- 这是因为它出现在文本中的概率相对于制表符来说概率更小。
CREATE TABLE records ( id string ) Row Format Delimited Fields Terminated By ‘\t’ ;
英语解释:行内格式的限定符以 ‘ \t ‘结尾终止
时间: 2024-11-10 00:27:44