2017-06-08 10 views
1

以下のコードを使用して、sparkからハイブステージファイルを削除しようとしています。このコードは、ディレクトリ内のファイルを削除できますが、 '.hive-staging_hive'で始まるすべてのファイルを削除します。JavaのHDFSから特定の名前で始まるディレクトリを削除する

特定のテキストから始まるディレクトリを削除する方法を知っていますか。

Configuration conf = new Configuration(); 
      System.out.println("560"); 
      Path output = new Path("hdfs://abcd/apps/hive/warehouse/mytest.db/cdri/.hive-staging_hive_2017-06-08_20-45-20_776_7391890064363958834-1/"); 
      FileSystem hdfs = FileSystem.get(conf); 

      System.out.println("564"); 

      // delete existing directory 
      if (hdfs.exists(output)) { 
       System.out.println("568"); 
       hdfs.delete(output, true); 
       System.out.println("570"); 

      } 
+0

これはシェルスクリプトで簡単に行うことができると思います。あなたはbashソリューションを利用できますか? – philantrovert

答えて

1

簡単な方法は、プロセス・フォームのJavaプログラムを実行し、ディレクトリ内「.hive-staging_hive」で始まるすべてのファイルを削除するには、ワイルドカードを使用することです。

String command="hadoop fs -rm pathToDirectory/.hive-staging_hive*"; 
int exitValue; 
try { 
    Process process = Runtime.getRuntime().exec(command); 
    process.waitFor(); 
    exitValue = process.exitValue(); 
}catch (Exception e) { 
    System.out.println("Cannot run command"); 
    e.printStackTrace(); 
} 

次の方法は、ディレクトリ内のすべてのファイルを一覧表示することです。 ".hive-staging_hive"で始まるファイルをフィルタリングして削除します。

Configuration conf = new Configuration(); 

Path path = new Path("hdfs://localhost:9000/tmp"); 

FileSystem fs = FileSystem.get(path.toUri(), conf); 

FileStatus[] fileStatus = fs.listStatus(path); 

List<FileStatus> filesToDelete = new ArrayList<FileStatus>(); 

for (FileStatus file: fileStatus) { 

    if (file.getPath().getName().startsWith(".hive-staging_hive")){ 
     filesToDelete.add(file); 
    } 
} 


for (int i=0; i<filesToDelete.size();i++){ 
    fs.delete(filesToDelete.get(i).getPath(), true); 
} 

+0

ありがとうShankar。あなたが触発した2番目のアポロは役に立つ。私はそれを試みた。しかし、彼らは ".hive-staging_hive"ディレクトリを引っ張っていない。私は通常のパーティションディレクトリだけを受け取ります。なぜ彼らがステージングディレクトリを引っ張っていないのか分かりますか? – AKC

+0

最初のアプローチearilierを試してみたら、「hadoopコマンドが見つからない」というエラーが表示されています。私のSparkクラスタは、ハープループクラスタの外にあります。私のスパークプログラムがhadoopクラスタに 'hadoop fs'コマンドを送信していない可能性があります。 – AKC

+0

こんにちは@AKC私は答えがうまくいくはずの2番目の部分を更新しました。私は地元でもテストしました。 –

関連する問題