shell脚本删除hive外部表用户指定多分区数据(删除hdfs上元数据)

1、首先我们创建一个多分区的外部表:tmp.clear_external_mulpartitiondata_test2,其中分区字段为year,month,day;并向该表中插入数据。

-- 创建源数据表tmp.cleardata_test2,并手动插入数据
drop table if exists tmp.cleardata_test2;
create table if not exists tmp.cleardata_test2(
    stuid  string,
	stuname  string,
    age int,
	`year` string,
	`month` string,
	`day`   string
)
row format delimited fields terminated by ',';

insert overwrite table tmp.cleardata_test2 values
('1','zhangsan',14,'2007','4','25'),
('2','lisi',12,'2009','5','15'),
('3','wangwu',14,'2007','8','10'),
('4','zhaoliu',15,'2006','10','9'),
('5','sunqi',12,'2009','5','12'),
('6','liuba',14,'2007','2','22'),
('7','yiyi',13,'2008','8','9'),
('8','ersha',15,'2006','11','13'),
('9','sande',11,'2010','3','30'),
('10','sige',14,'2007','4','16'),
('11','zhaoqian',14,'2007','6','7'),
('12','zhengwu',13,'2008','1','13'),
('13','zhouwang',13,'2008','12','1'),
('14','shangguan',15,'2006','9','10'),
('15','ruqian',14,'2007','5','5'),
('16','lilin',12,'2009','4','1'),
('17','wangjing',14,'2007','8','12'),
('18','zhaosi',15,'2006','7','9'),
('19','tangkai',14,'2007','8','10'),
('20','wangliang',14,'2007','8','10');

--创建目标表tmp.clear_external_mulpartitiondata_test2并通过select方式插入数据
drop table if exists tmp.clear_external_mulpartitiondata_test2;
create external table if not exists tmp.clear_external_mulpartitiondata_test2(
    stuid  string,
	stuname  string,
    age int	
) partitioned by(`year` string,`month` string,`day` string)
row format delimited fields terminated by ',';
insert overwrite table tmp.clear_external_mulpartitiondata_test2 partition (`year`,`month`,`day`) select stuid,stuname,age,`year`,`month`,`day` from tmp.cleardata_test2;

2、表数据展示
在这里插入图片描述
3、编写shell脚本,根据用户输入的参数删除hive表中数据,同时删除hdfs上元数据。

#!/bin/bash
# 脚本名称:partition_test.sh 

#首先判断用户输入的参数格式是否小于一个,如小于一个参数,要求用户至少输入数据库.表名
if [ $# -lt 1 ];then
    echo "请至少提供数据库.表名"
fi

#使用正则匹配目标表在hdfs上的路径
info=`hive -e "desc formatted $1"`
info=(`echo $info| sed -r "s/.*?(hdfs:.*?) Table.*?/\1/g"`)
info=${info[0]}

#参数列表 DB.TABLE 第一层分区值 第二层分区值 ...,形成参数列表数组
ps=($*)
#分区字段名数组
pp=("year" "month" "day")
pi=0
#删除参数列表中的DB.TABLE
unset ps[0]
#循环拼多级分区名
for p in ${ps[@]};do
    info=$info"/"${pp[pi]}"="$p
    ((pi++))
done

#hdfs dfs -rm -r -skipTrash $PATH   慎用彻底删除
#删除放入回收站
hdfs dfs -rm -r "$info"

4、在linux中执行该脚本,执行时先授予脚本可执行权限,然后传入参数执行脚本
在这里插入图片描述
5、如上图所示,先授予可执行权限,然后传入参数

  • 数据库.表名=tmp.clear_external_partitiondata_test2
  • year=2007
  • month=5
  • day=5
    开始删除hdfs上面的路径,同时hive中表数据也被删除

6、验证hive数据和hdfs上元数据是否存在
在这里插入图片描述

  • hdfs上2007年5月5日的路径已经不存在,说明元数据已经删除
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值