Количество файлов в каталоге HDFS

В Java-коде я хочу подключиться к каталогу в HDFS, узнать количество файлов в этом каталоге, получить их имена и прочитать их. Я уже могу прочитать файлы, но я не мог понять, как подсчитать файлы в каталоге и получить имена файлов, как обычный каталог.

Чтобы читать, я использую DFSClient и открываю файлы в InputStream.

Ответ 1

счетчик

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();
}

Ответ 2

FileSystem fs = FileSystem.get(conf);
Path pt = new Path("/path");
ContentSummary cs = fs.getContentSummary(pt);
long fileCount = cs.getFileCount();

Ответ 3

Для быстрого и простого подсчета вы также можете попробовать следующий -l iner:

hdfs dfs -ls -R /path/to/your/directory/ | grep -E '^-' | wc -l

Быстрое объяснение:

grep -E '^-' или egrep '^-': файлы будут начинаться с -, тогда как папки будут начинаться с d;

wc -l: количество строк.

Ответ 4

В командной строке вы можете сделать это, как показано ниже.

 hdfs dfs -ls $parentdirectory | awk '{system("hdfs dfs -count " $6) }'

Ответ 5

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.