按日期删除HDFS数据

转自:http://blog.csdn.net/eryk86/article/details/7472346

  1. import java.io.IOException;  
  2. import java.text.SimpleDateFormat;  
  3. import java.util.Calendar;  
  4. import java.util.HashSet;  
  5. import java.util.Set;  
  6.   
  7. import org.apache.hadoop.conf.Configuration;  
  8. import org.apache.hadoop.fs.FileStatus;  
  9. import org.apache.hadoop.fs.FileSystem;  
  10. import org.apache.hadoop.fs.Path;  
  11. /** 
  12.  *  
  13.  * @author eryk 
  14.  * 
  15.  */  
  16. public class DeleteHDFSFile {  
  17.   
  18.     private FileSystem fs;  
  19.     private Set<Path> _delete = new HashSet<Path>(); // 记录要删除的路径  
  20.   
  21.     public DeleteHDFSFile(FileSystem fs) {  
  22.         this.fs = fs;  
  23.     }  
  24.       
  25.     /** 
  26.      *  
  27.      * @param args 
  28.      *      args[0] N天内的数据要保留 
  29.      *      args[1] 要删除数据的路径        /run/output/hadoop 
  30.      * @throws Exception 
  31.      */  
  32.     public static void main(String[] args) throws Exception {  
  33.         Configuration _conf = new Configuration();  
  34.         FileSystem fs = FileSystem.get(_conf);  
  35.         DeleteHDFSFile df = new DeleteHDFSFile(fs);  
  36.           
  37.         Calendar calendar = Calendar.getInstance();  
  38.         calendar.add(Calendar.DAY_OF_MONTH, Integer.parseInt("-"+args[0]));  
  39.         String date = new SimpleDateFormat("yyyyMMdd").format(calendar.getTime());  
  40.           
  41.         df.fileList(args[1],Integer.parseInt(date));  
  42.           
  43.         for(Path _path: df._delete){  
  44.             if(fs.exists(_path)){  
  45.                 fs.delete(_path);  
  46.             System.out.println("delete:"+_path);  
  47.             }  
  48.         }  
  49.         fs.close();  
  50.     }  
  51.   
  52.     public void fileList(String path,int date) throws IOException{  
  53.         FileStatus[] fileList = fs.listStatus(new Path(path));  
  54.           
  55.         if(fileList == null)return;  
  56.           
  57.         for(FileStatus file : fileList){  
  58.             String _path = file.getPath().toString();  
  59.             if(file.isDir()){  
  60.                 if(_path.matches(".*?\\d{8}?.*")){  
  61.                     String[] _pathDate = _path.split("/");  
  62.                     for(String d : _pathDate){  
  63.                         boolean t = (d.matches("\\d{8}"))? (Integer.parseInt(d)< date)? true : false : false;  
  64.                         if(t){  
  65.                             System.out.println("add delete list :"+ _path);  
  66.                             _delete.add(new Path(_path));  
  67.                         }  
  68.                     }  
  69.                 }  
  70.                 fileList(file.getPath().toString(),date);  
  71.             }  
  72.         }  
  73.     }  
  74. }  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以按照以下步骤在Hive中创建表score,并将数据加载进去: 1. 在Hive中创建数据库hive_database(如果不存在),并切换到该数据库: ``` CREATE DATABASE IF NOT EXISTS hive_database; USE hive_database; ``` 2. 创建外部表score,指定数据文件存储位置为HDFS目录 /scoredatas/month=202301,同时指定表的列名和数据类型: ``` CREATE EXTERNAL TABLE IF NOT EXISTS score ( s_id STRING, c_id STRING, s_score INT ) PARTITIONED BY (month STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION '/scoredatas'; ``` 这个语句会在Hive中创建一个名为score的外部表,其中包含三个列:s_id、c_id和s_score,分别对应学生学号、课程号和成绩。表的数据文件存储位置为HDFS目录 /scoredatas,但是这个目录下还包含一个名为month=202301的子目录,该子目录是一个分区,用于存储2023年1月份的数据。 3. 将数据加载进表中,使用Hive的LOAD DATA语句,加载HDFS目录 /scoredatas/month=202301 下的数据: ``` LOAD DATA INPATH '/scoredatas/month=202301/score.csv' INTO TABLE score PARTITION (month='202301'); ``` 这个语句会将HDFS目录 /scoredatas/month=202301 下的score.csv文件中的数据加载进表score中,同时指定分区为month='202301'。 4. 如果要删除表score,可以使用DROP TABLE语句,但是这样会将表的元数据和分区信息一起删除,导致数据文件也被删除。如果要保留数据文件,可以使用DROP TABLE ... PURGE语句,该语句会强制删除表及其数据,但不会删除数据文件: ``` DROP TABLE IF EXISTS score PURGE; ``` 注意,在使用PURGE选项时要格外小心,以免意外删除数据文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值