примечание: Я не смог проверить это, но вы можете проверить это шаг за шагом, посмотрев на вывод:
Обычно я бы сказал Никогда не анализируйте вывод ls
, но с hadoop
у вас на самом деле нет выбора, поскольку нет эквивалента find
. (Начиная с версии 2.7.0 есть находка, но она очень ограничена в соответствии с документацией )
Шаг 1: рекурсив ls
$ hadoop fs -ls -R /path/to/folder/
Шаг 2: используйте awk
для выбора только файлов и csv
только для файлов
каталоги распознаются по их разрешениям, которые начинаются с d
, поэтому мы должны исключить их. И файлы csv
распознаются по последнему полю, оканчивающемуся на csv
:
$ hadoop fs -ls -R /path/to/folder/ | awk '!/^d/ && /\.csv$/'
убедитесь, что у вас нет пустых строк или просто имя каталога ...
Шаг 3: продолжайте использовать awk
для обработки времени. Я предполагаю, что у вас есть какой-либо стандартный awk, поэтому я не буду использовать расширения GNU. Hadoop выведет формат времени как yyyy-MM-dd HH:mm
. Это сортируемый формат, который находится в полях 6 и 7:
$ hadoop fs -ls -R /path/to/folder/ \
| awk -v cutoff="$(date -d '-24 hours' '+%F %H:%M')" \
'(!/^d/) && /\.csv$/ && (($6" "$7) > cutoff)'
Шаг 4: Копирование файлов по одному:
Сначала проверьте команду, которую вы собираетесь выполнить:
$ hadoop fs -ls -R /path/to/folder/ \
| awk -v cutoff="$(date -d '-24 hours' '+%F %H:%M')" \
'(!/^d/) && /\.csv$/ && (($6" "$7) > cutoff) {
print "migrating", $NF
cmd="hadoop fs -get "$NF" /path/to/local/"
print cmd
# system(cmd)
}'
(удалите #
, если хотите выполнить)
или
$ hadoop fs -ls -R /path/to/folder/ \
| awk -v cutoff="$(date -d '-24 hours' '+%F %H:%M')" \
'(!/^d/) && /\.csv$/ && (($6" "$7) > cutoff) {
print $NF
}' | xargs -I{} echo hadoop fs -get '{}' /path/to/local/
(удалите эхо, если хотите выполнить)