Javaコードで、HDFSのディレクトリに接続し、そのディレクトリ内のファイル数を知り、名前を取得してそれらを読みたい。すでにファイルを読むことができるが、できなかったディレクトリ内のファイルをカウントし、通常のディレクトリのようにファイル名を取得する方法を理解しないでください。
読むために、私はDFSClientを使用し、InputStreamにファイルを開きます。
カウント
Usage: hadoop fs -count [-q] <paths>
指定したファイルパターンに一致するパスの下のディレクトリ、ファイル、およびバイトの数をカウントします。出力列は、DIR_COUNT、FILE_COUNT、CONTENT_SIZE FILE_NAMEです。
-qの出力列は次のとおりです QUOTA、REMAINING_QUATA、SPACE_QUOTA、REMAINING_SPACE_QUOTA、DIR_COUNT、FILE_COUNT、CONTENT_SIZE、FILE_NAME。
例:
hadoop fs -count hdfs://nn1.example.com/file1 hdfs://nn2.example.com/file2
hadoop fs -count -q hdfs://nn1.example.com/file1
終了コード:
成功した場合は0を返し、エラーの場合は-1を返します。
FileSystemを使用して、パス内のファイルを反復処理できます。以下にサンプルコードを示します
int count = 0;
FileSystem fs = FileSystem.get(getConf());
boolean recursive = false;
RemoteIterator<LocatedFileStatus> ri = fs.listFiles(new Path("hdfs://my/path"), recursive);
while (ri.hasNext()){
count++;
ri.next();
}
FileSystem fs = FileSystem.get(conf);
Path pt = new Path("/path");
ContentSummary cs = fs.getContentSummary(pt);
long fileCount = cs.getFileCount();
迅速で簡単なカウントを行うには、次のワンライナーを試すこともできます:
hdfs dfs -ls -R /path/to/your/directory/ | grep -E '^-' | wc -l
簡単な説明:
grep -E '^-'
またはegrep '^-'
:Grep all files:ファイルは '-'で始まり、フォルダーは 'd'で始まります。
wc -l
:行数。
コマンドラインでは、次のように実行できます。
hdfs dfs -ls $parentdirectory | awk '{system("hdfs dfs -count " $6) }'
hadoop fs -du [-s] [-h] [-x] URI [URI ...]
指定されたディレクトリに含まれるファイルとディレクトリのサイズ、またはファイルだけの場合はファイルの長さを表示します。
オプション:
The -s option will result in an aggregate summary of file lengths being displayed, rather than the individual files. Without the -s option, calculation is done by going 1-level deep from the given path.
The -h option will format file sizes in a “human-readable” fashion (e.g 64.0m instead of 67108864)
The -x option will exclude snapshots from the result calculation. Without the -x option (default), the result is always calculated from all INodes, including all snapshots under the given path.