Java APIを使用してHDFS内でファイルを移動したい。これを行う方法がわかりません。FileSystemクラスは、ローカルファイルシステムとの間の移動のみを許可したいようです。 。しかし、HDFSに保持し、そこに移動したいと思います。
私は何か基本的なものが欠けていますか?私がそれを行うことができる唯一の方法は、入力ストリームからそれを読み取り、それを書き戻すことです...そして古いコピーを削除します(うん)。
ありがとう
FileSystem.rename() を使用します:
public abstract boolean rename(Path src, Path dst) throws IOException
パス
src
の名前をパスdst
に変更します。ローカルのfsまたはリモートのDFSで実行できます。パラメータ:
src
-名前を変更するパスdst
-名前変更後の新しいパス
戻り値:true
名前の変更が成功した場合
スロー:
IOException -失敗時
Java.nio。*アプローチは、HDFSで常に機能するとは限りません。だから、うまくいく次の解決策を見つけました。
Org.Apache.hadoop.fs.FileUtil.copy APIを使用して、あるディレクトリから別のディレクトリにファイルを移動します
val fs = FileSystem.get(new Configuration())
val conf = new org.Apache.hadoop.conf.Configuration()
val srcFs = FileSystem.get(new org.Apache.hadoop.conf.Configuration())
val dstFs = FileSystem.get(new org.Apache.hadoop.conf.Configuration())
val dstPath = new org.Apache.hadoop.fs.Path(DEST_FILE_DIR)
for (file <- fileList) {
// The 5th parameter indicates whether source should be deleted or not
FileUtil.copy(srcFs, file, dstFs, dstPath, true, conf)
FileUtiltsreplaceFileも目的を解決すると思います。 http://hadoop.Apache.org/common/docs/current/api/org/Apache/hadoop/fs/FileUtil.html#replaceFile(Java.io.File 、Java.io.File )
hdfsDirectory="hdfs://srcPath"
val conf = new org.Apache.hadoop.conf.Configuration()
val src:Path = new org.Apache.hadoop.fs.Path(hdfsDirectory)
val fs = FileSystem.get(src.toUri,conf)
val srcPath: Path = new Path("hdfs://srcPath")
val srcFs =FileSystem.get(srcPath.toUri,conf)
val dstPath:Path =new Path("hdfs://targetPath/")
val dstFs =FileSystem.get(dstPath.toUri,conf)
val exists = fs.exists(new org.Apache.hadoop.fs.Path(hdfsDirectory))
val status:Array[FileStatus] = fs.listStatus(new Path(hdfsDirectory))
if (status.length>0) {
status.foreach(x => {
println("My files: " + x.getPath)
FileUtil.copy(srcFs, x.getPath, dstFs, dstPath, true, conf)
println("Files moved !!" +x.getPath)
}
)}
else{
println("No Files Found !!")
}