Количество файлов в каталоге 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.