HIVE外部表删除重建指定HDFS目录后查询不到数据

HIVE外部表删除重建指定HDFS目录后查询不到数据,怎么办


  • 删除了外部表,没有删除hdfs文件
  • 重建了外部表又关联到之前的hdfs目录之后,select查询却没有数据
  • 需要MSCK REPAIR TABLE+tablename,之后查询,数据就回来了。

MSCK REPAIR TABLE命令是做啥的

MSCK REPAIR TABLE命令主要是用来解决通过hdfs dfs -put或者hdfs api写入hive分区表的数据在hive中无法被查询到的问题。

hive有个服务叫metastore,这个服务主要是存储一些元数据信息,比如数据库名,表名或者表的分区等等信息。如果不是通过hive的insert等插入语句,很多分区信息在metastore中是没有的。只需要运行MSCK REPAIR TABLE命令,hive就会去检测这个表在hdfs上的文件,把没有写入metastore的分区信息写入metastore。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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,并且设置了正确的Hadoop和Hive环境变量。 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
发出的红包

打赏作者

科技改变未来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值