Это адаптация этого ответа :
примечание: Я не смог проверить это, но вы можете проверить это шаг за шагом, посмотрев наoutput:
Обычно я бы сказал Никогда не анализируйте выходные данные ls
, но с Hadoop у вас нет выбора здесь, поскольку нет эквивалента find
.(Начиная с версии 2.7.0 существует находка, но она очень ограничена согласно документации )
Шаг 1: рекурсивный ls
$ hadoop fs -ls -R /path/to/folder/
Шаг 2: используйте awk только для выбора файлов.Каталоги распознаются по их разрешениям, которые начинаются с d
, поэтому мы должны исключить их.
$ hadoop fs -ls -R /path/to/folder/ | awk '!/^d/'
убедитесь, что у вас не заканчиваются смешные строки, которые являются пустыми или просто именем каталога ...
Шаг 3: используйте awk для обработки временного интервала и выбора каталогов.Я предполагаю, что у вас есть какой-либо стандартный awk, поэтому я не буду использовать расширения GNU.Hadoop выведет формат времени как yyyy-MM-dd HH:mm
.Этот формат может быть отсортирован и находится в полях 6 и 7. В приведенном ниже примере отфильтровываются все файлы, которые находятся между «2019-09-21 22:00» и «2019-09-21 23:00»:
$ hadoop fs -ls -R /path/to/folder/ \
| awk -v tStart="2019-09-21 22:00" -v tEnd="2019-09-21 23:00" \
'(!/^d/) && (($6" "$7) >= tStart) && (($6" "$7") <= tEnd)'