博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
删除外部表时遇到的坑
阅读量:6573 次
发布时间:2019-06-24

本文共 1185 字,大约阅读时间需要 3 分钟。

洗引擎数据的时候,由于改动了几个字段,因此需要删除原来关联了HDFS指定路径的外部表,重新建外部表表并关联HDFS。问题就出现在删外部表上,开始使用truncate的时候,发现并不能 删除外部表,于是查了查发现truncate只能删除内部表,于是果断使用一下命令将外部表先变成了内部表,然后再使用drop进行删除

alter table xxx set tblproperties('external'='false')

drop table xxx

结果表是给删除了,然后发现HDFS上关联路径下的分区数据也全部没了,然后就开始了凄惨的补数据之路...

现在总结下外部表和内部表:

1.内、外部表区别与联系

外部表——>创建表的时候指定external,外部表在删除之后,仅会删除hive外部表中元数据,不会删除数据和指定路径

内部表——>删除内部表会将数据和默认路径都删除,因此可能会误删数据,谨慎操作

教训:千万不要为了删除外部表就将外部表先转化为内部表,这样会将HDFS上的数据一并删除的

内外部表转换

内部表——>外部表:alter table xxx set tblproperties('external'='false')

外部表——>内部表:alter table xxx set tblproperties('external'='true')

2.truncate和drop以及delete简介

1)truncate:用于删除表或者分区中所有的行,但表结构及其列、约束、索引等保持不变,而且不记录单个行删除操作

  • truncate table tablename [partition partition_spec]           省略了partition会删除表中所有分区

  • truncate不能用于删除外部表,因为外部表中只是存放着元数据,真实数据并不在hive中

2)delete: 可以删除特定行,也可以删除所有行,并且在事务日志中为所删除的每行记录一项

  • 不带where字句的delete和truncate功能相同,均是删除表中的全部行,但是truncate速度快,并且使用的系统和事务日志资源少

  • 由foreign key约束引用的表,不能使用truncate删除,而应该使用不带where子句的delete进行删除,由于truncate table不记录在日志中,所以它不能激活触发器

3)drop:删除整个表数据及其表定义

  • drop table [if exists] tablename

3.删除外部表——这样可以避免误删关联路径中数据

1)删除外部表分区

alter table tablename drop partition(partitions...)

2)删除HDFS上的数据

hdfs dfs -ls url_name

reference:

                

转载地址:http://grmjo.baihongyu.com/

你可能感兴趣的文章
[Javascript] Add a browser build to an npm module
查看>>
线程安全的atomic wrapper classes例子
查看>>
[摘录]调动员工积极性的七个关键
查看>>
Linux getcwd()的实现【转】
查看>>
Backup Volume 操作 - 每天5分钟玩转 OpenStack(59)
查看>>
.htaccess 基础教程(四)Apache RewriteCond 规则参数
查看>>
转: maven进阶:一个多模块项目
查看>>
Android控件之HorizontalScrollView 去掉滚动条
查看>>
linux 查看系统信息命令
查看>>
手工加载DLL
查看>>
[C#]System.Timers.Timer
查看>>
picker.js源码
查看>>
UVM中的class--2
查看>>
关于异常的合理处理方式
查看>>
SSH框架总结(框架分析+环境搭建+实例源码下载)
查看>>
javascript ES3小测试
查看>>
Android - Animation(二)
查看>>
Android6.0指纹识别开发
查看>>
Lucene简介
查看>>
Hibernate概述
查看>>