Фильтрация файлов в HDFS с временным диапазоном - PullRequest
1 голос
/ 23 сентября 2019

У меня есть список файлов в HDFS, который должен быть отфильтрован за последний n-часовой период с помощью сценариев bash

$ find . -name "*" -type f                  \
    -newermt "2019-09-22 23:59:59"          \
    ! -newermt "2019-09-23 23:59:59"        \
    -exec ls -lt --time-style=long-iso {} +

попытался, но все еще застрял с фильтрацией на уровне даты, не может продолжаться дальше

Ожидается, что файлы HDFS будут отфильтрованы за любой n-часовой период дня

1 Ответ

1 голос
/ 23 сентября 2019

Это адаптация этого ответа :

примечание: Я не смог проверить это, но вы можете проверить это шаг за шагом, посмотрев наoutput:

Обычно я бы сказал Никогда не анализируйте выходные данные ls, но с Hadoop у вас нет выбора здесь, поскольку нет эквивалента find.(Начиная с версии 2.7.0 существует находка, но она очень ограничена согласно документации )

Шаг 1: рекурсивный ls

$ hadoop fs -ls -R /path/to/folder/

Шаг 2: используйте только для выбора файлов.Каталоги распознаются по их разрешениям, которые начинаются с d, поэтому мы должны исключить их.

$ hadoop fs -ls -R /path/to/folder/ | awk '!/^d/'

убедитесь, что у вас не заканчиваются смешные строки, которые являются пустыми или просто именем каталога ...

Шаг 3: используйте для обработки временного интервала и выбора каталогов.Я предполагаю, что у вас есть какой-либо стандартный 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)'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...