hive内部表和外部表以及修复元数据 | 青训营笔记

292 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第12天 在学习内部表和外部表的时候,当时对内外表的概念十分了解,可是最近建表时发现了两个问题:

  1. 我建表时明明加了external,可是导入后原始数据的位置改变了,删除也会将文件删除;
  2. 明明向外部表所指的文件夹放数据了,但是hive中count等涉及元数据的信息会有问题;

内部(管理)表和外部表external

  • 不能用load data:相当于将原始数据移动到hive表的默认路径,与挂载(location)不同;
  • 挂载数据location:对于含分区创建表指定location的外部表,要指定为文件夹;
  • location指向路径数据改变不会记录元数据,需要重新alter table table_name set location '/export/data/README.txt';刷新元数据;

区别表格如下:

内部表外部表
创建移动原始数据路径记录到元数据,需要指定location
删除元 / 原始数据都删只删除元数据,不能truncate
  • 元数据:指向原始数据的路径;原始数据:数据的存储位置

修复元数据

set hive.msck.path.validation=ignore; --多层分区
msck repair table tablename; --恢复hdfs上的元数据
refresh database.tablename; --刷新表--使用hive自带命令
bin/metatool -help

Impala中的invalidate metadata和refresh INVALIDATE METADATA是用于刷新全库或者某个表的元数据,包括表的元数据和表内的文件数据,它会首先清楚表的缓存,然后从metastore中重新加载全部数据并缓存,该操作代价比较重,主要用于在hive中修改了表的元数据,需要同步到impalad,例如create table/drop table/alter table add columns等。

INVALIDATE METADATA 语法:

INVALIDATE METADATA;                   //重新加载所有库中的所有表
INVALIDATE METADATA [table]            //重新加载指定的某个表

REFRESH是用于刷新某个表或者某个分区的数据信息,它会重用之前的表元数据,仅仅执行文件刷新操作,它能够检测到表中分区的增加和减少,主要用于表中元数据未修改,数据的修改,例如INSERT INTO、LOAD DATA、ALTER TABLE ADD PARTITION、LLTER TABLE DROP PARTITION等,如果直接修改表的HDFS文件(增加、删除或者重命名)也需要指定REFRESH刷新数据信息。

REFRESH 语法:

REFRESH [table]                             //刷新某个表
REFRESH [table] PARTITION [partition]       //刷新某个表的某个分区

参考:cloud.tencent.com/developer/a…