Hive - 如何删除外部 Hive 表及其数据

15

我正在使用

drop table <table_name>

如果我使用相同的模式和名称重新创建表格,我将得到旧数据。 需要从HDFS文件系统中删除表目录才能完全摆脱这些数据吗?


你可以查看这个链接,它可能会有所帮助:https://issues.apache.org/jira/browse/HIVE-4367 - shashaDenovo
6个回答

6
你需要在删除外部表之前将其转换为内部表: 示例
beeline> ALTER TABLE $tablename SET TBLPROPERTIES('EXTERNAL'='False'); // make the table as internal

然后:

beeline> drop table $tablename; //if you drop the table data will be dropped as well.

4

首先使用以下命令获取表的路径:

hive> describe formatted database_name.table_name;

然后复制在描述中出现的整个位置,例如: /user/hive/warehouse/database_name.db/table_name

之后使用以下命令从给定的表中截断所有数据:

***hive> dfs -rmr /user/hive/warehouse/database_name.db/table_name;*** 

或者

***hive> dfs -rm -r /user/hive/warehouse/database_name.db/table_name;***

然后,您可以使用DROP TABLE命令完全清除它。

这是有史以来最好的答案。谢谢。 - Yamur

2
虽然我同意pensz的看法,但你不需要删除表格。只需用任何新文件替换外部hdfs文件(被替换的文件结构应相同),当你对先前的表格进行选择时,你会注意到它将具有新的数据而不是旧数据。
外部表格基本上只表示数据的模式和文件的位置。你可以向同一位置添加多个文件,你的表格将自动包含所有与这些文件相关的数据。同样,你可以替换任何数据,你的表格将自动反映这一点。

1
然而,如果您的表已经分区,那么需要进行一些微小的更改。我假设您的表没有被分区。 - Nicole Hu

1

除非你需要更多的HDFS空间,否则不需要删除HDFS中的目录。

如果你想要替换新数据,只需在HDFS中替换文件即可。

如果你想要将表名用于其他用途,则需要删除HDFS中的表并删除目录。

实际上,我认为这是一个非常方便的功能,可以在不丢失任何数据的情况下更改表的模式(例如,你想要更改字段名称或将两个字段连接成一个字段)。


2
我的问题是我需要清除数据,但保留相同名称和架构的表格? - amrk7
5
删除HDFS文件,删除表;导入新文件到HDFS并创建新表。 - pensz

0
如果这是一个外部表,删除表只会删除表的结构,而不会删除HDFS中的文件。因此,您需要手动从HDFS中删除该文件,或者创建一个新表,并在tbl属性中指定不同的文件位置。

-1

截断外部表会导致“编译语句时出错:FAILED: SemanticException [Error 10146]: 无法截断非托管表TABLENAME。” - Keith Sirmons

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接