Hive中Parquet表插入后文件归属及DROP TABLE PURGE操作影响咨询
问题背景
你需要清理Hive中Parquet表table_a的部分数据,计划创建新表table_b并执行以下SQL语句:
Insert Overwrite table table_b select * from table_a Where (my conditions to exclude the right fields here)
想确认两个问题:两张表是否共用同一HDFS文件?执行DROP TABLE table_a PURGE操作后,两张表的数据是否都会消失?
详细解答
两张表是否共用同一HDFS文件?
完全不会。当你执行INSERT OVERWRITE写入table_b时,Hive会为table_b在其专属的HDFS存储路径下生成全新的Parquet数据文件。这些文件是从table_a筛选后的数据复制而来的,和table_a的原始文件是完全独立的两份——相当于做了一次数据的筛选复制,而非共享源文件。你可以通过Hive命令验证这一点:分别执行
DESCRIBE FORMATTED table_a;和DESCRIBE FORMATTED table_b;,在输出结果中找到Location字段,会看到它们指向HDFS上不同的存储目录。执行
DROP TABLE table_a PURGE后,两张表的数据是否都会消失?
不会。table_b的数据存储在自己的HDFS目录中,和table_a的存储完全分离。DROP TABLE table_a PURGE只会删除table_a对应的HDFS目录及其中的所有文件,同时移除Hive元数据中关于table_a的信息。而table_b的元数据和数据文件都不会受到任何影响,依然可以正常查询和使用。额外提醒:如果
table_b是你特意创建的外部表,DROP TABLE操作默认不会删除其HDFS数据;但如果是通过INSERT OVERWRITE默认创建的内部表,数据同样会保留——不管哪种情况,table_a的删除操作都不会牵连table_b的数据。
内容的提问来源于stack exchange,提问作者Katie

