记一次Hive库里手动删除表,但是HDFS上还存在表文件奇怪问题

正常在hive库即hive命令行中删除一张表,hdfs上也是同步的被删除的,但是这次发现在hive里手动建了一张表,然后使用drop table 表名后,hive库里的确没发现这张表了,但是HDFS上还是有。

我使用的建表建库语句:

create database test1 location 'hdfs://beh/user/test1/test1.db';   //创建库指定路径
use test1;
create table test1(id int);

删除表的语句:

drop table test1;

不是外部表,并且回收站中也没有该表被删除的信息。

经百度,说是由于Hive权限与HDFS权限分离导致的原因,即Hive权限管理比较弱,/user目录权限为700:

参考网址:https://cloud.tencent.com/info/dfa3e02544bec8e457628fa982e10434.html

但我看了一下,我自己的权限为755,是足够的:

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要正确删除Hive外部并同时删除HDFS上的数据,可以使用以下步骤: 1. 在Hive中使用DROP TABLE语句删除外部,例如: ``` DROP TABLE my_external_table; ``` 2. 确认已被删除,可以使用SHOW TABLES语句检查: ``` SHOW TABLES; ``` 3. 在HDFS删除表的数据,可以使用以下命令: ``` hadoop fs -rm -r /path/to/table/data ``` 其中,/path/to/table/data是外部数据存储的HDFS路径。 4. 确认数据已被删除,可以使用以下命令: ``` hadoop fs -ls /path/to/table/data ``` 如果输出为空,则示数据已被成功删除。 注意:删除外部时,只会删除Hive元数据,不会删除HDFS上的数据。因此,需要手动删除HDFS上的数据以释放存储空间。 ### 回答2: 在Spark中删除Hive外部时,我们需要确保同时删除HDFS上的相关数据。在这里,我们提供如下的几种方法,可以帮助您正确删除Hive外部。 一、使用Hive Shell 1. 确保您已经连接到了Hive Shell,并且设置了正确的HadoopHive环境变量。 2. 在Hive Shell中,输入命令“DROP TABLE IF EXISTS external_table_name;”,以删除指定的外部。 3. 输入命令“!hadoop fs -rm -r /path/to/external_table_name;”,以删除HDFS上的相关数据。请注意,这里的“/path/to/external_table_name”需要替换为您实际使用的HDFS路径。 二、使用Scala代码 1. 在Spark中创建一个HiveContext对象,用于与Hive进行交互。 ``` val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc) ``` 2. 使用HiveContext对象,执行SQL语句删除指定的外部以及相关数据。 ``` hiveContext.sql("DROP TABLE IF EXISTS external_table_name") import org.apache.hadoop.fs.FileSystem import org.apache.hadoop.fs.Path val fs = FileSystem.get(sc.hadoopConfiguration) fs.delete(new Path("/path/to/external_table_name"), true) ``` 请注意,这里的“/path/to/external_table_name”需要替换为您实际使用的HDFS路径。 三、使用Python代码 1. 在Spark中创建一个HiveContext对象,用于与Hive进行交互。 ``` from pyspark.sql import HiveContext hiveContext = HiveContext(sc) ``` 2. 使用HiveContext对象,执行SQL语句删除指定的外部以及相关数据。 ``` hiveContext.sql("DROP TABLE IF EXISTS external_table_name") import subprocess subprocess.call(["hadoop", "fs", "-rm", "-r", "/path/to/external_table_name"]) ``` 请注意,这里的“/path/to/external_table_name”需要替换为您实际使用的HDFS路径。 总结 以上三种方法均可以帮助您正确地删除Hive外部,并同时删除HDFS上的相关数据。根据您的实际情况和个人喜好,可以选择使用其中的任一种方法。 ### 回答3: Spark是一个开源的大数据处理框架,它可以与Hive集成,来进行数据处理和查询。在使用Spark进行Hive外部操作时,如果需要删除表时同时删除HDFS上的数据,可以按照以下步骤进行: 1. 使用Spark的HiveContext来获取要删除的元数据,例如: ``` val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc) val tableMetadata = hiveContext.table("database.table").toDF ``` 2. 从元数据中获取的路径,例如: ``` val tablePath = tableMetadata.select("location").collect()(0)(0).toString ``` 3. 使用Hadoop File System(HDFS)的API来删除表的路径,例如: ``` import org.apache.hadoop.fs.FileSystem import org.apache.hadoop.fs.Path val hdfs = FileSystem.get(sc.hadoopConfiguration) hdfs.delete(new Path(tablePath), true) ``` 4. 使用Spark的SQLContext来删除表,例如: ``` val sqlContext = new org.apache.spark.sql.SQLContext(sc) sqlContext.sql("DROP TABLE database.table") ``` 通过以上步骤,即可正确地删除Hive外部,并且同时删除HDFS上的数据。需要注意的是,在进行该操作前,请确保将删除操作纳入了数据管理的策略中,避免误删数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值