这是我参与「第四届青训营 」笔记创作活动的第12天 在学习内部表和外部表的时候,当时对内外表的概念十分了解,可是最近建表时发现了两个问题:
- 我建表时明明加了
external
,可是导入后原始数据的位置改变了,删除也会将文件删除; - 明明向外部表所指的文件夹放数据了,但是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] //刷新某个表的某个分区