このためのJavaコードを記述したくない場合は、コマンドラインHDFSAPIを使用するのが最善の策だと思います。
mv
Hadoopで
hadoop fs -mv URI [URI …] <dest>
小さなワンライナーを使用してパスを取得できます。
% hadoop fs -ls /user/foo/bar | awk '!/^d/ {print $8}'
/user/foo/bar/blacklist
/user/foo/bar/books-eng
...
これにより、awk
出力からディレクトリが削除されます。これで、これらのファイルを変数に入れることができます。
% files=$(hadoop fs -ls /user/foo/bar | awk '!/^d/ {print $8}')
各ファイルの名前を変更します。
% for f in $files; do hadoop fs -mv $f $f.lzo; done
awk
他の基準でファイルをフィルタリングするために使用することもできます。これにより、正規表現に一致するファイルが削除されますnolzo
。ただし、テストされていません。しかし、この方法で柔軟なフィルターを作成できます。
% files=$(hadoop fs -ls /user/foo/bar | awk '!/^d|nolzo/ {print $8}' )
hadoop
コマンドを次のように置き換えて機能するかどうかをテストしecho
ます。
$ for f in $files; do echo $f $f.lzo; done
編集:より信頼性の高い出力awk
の代わりに使用するように例を更新しました。sed
それを行う「正しい」方法は、おそらくHDFS Java APIを使用することです。ただし、シェルを使用する方が、ほとんどのジョブでおそらくより高速で柔軟性があります。