Переименовать файл после putHDFS - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть apache NIFI, где я получаю файл из системы, используя getFile, затем я использую putHDFS, как я могу переименовать файл в HDFS после помещения файла в hadoop?Я пытался использовать executeScript процессор, но не могу заставить его работать

flowFile = session.get()
if flowFile != None:
    tempFileName= flowFile.getAttribute("filename")
    fileName=tempFileName.replace('._COPYING_','')
    flowFile = session.putAttribute(flowFile, 'filename', fileName)
    session.transfer(flowFile, REL_SUCCESS)

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Ответ Шу, приведенный выше, является правильным для того, как манипулировать атрибутом имени файла в NiFi, но если вы уже записали файл в HDFS и затем используете UpdateAttribute, он не собирается изменять имя файла в HDFS, этотолько изменит значение атрибута имени файла в NiFi.

Вы можете использовать подход UpdateAttribute для создания нового атрибута с именем "final.filename", а затем использовать MoveHDFS для перемещения исходного файла в конечный файл.

Также следует отметить, что процессор PutHDFSуже записывает временный файл и перемещает его в окончательный файл, поэтому я не уверен, если вам необходимо назвать «. COPYING ».Например, если вы отправляете файл потока в PutHDFS с именем файла «foo», он сначала записывает «.foo» в каталог, а по завершении перемещает его в «foo».

Единственный случай, когда вынеобходимо использовать MoveHDFS, если какой-то другой процесс отслеживает каталог и не может игнорировать точечные файлы, тогда вы записываете его где-то еще и используете MoveHDFS после его завершения.

0 голосов
/ 20 сентября 2018

Вместо использования ExecuteScript процессор (дополнительные издержки) использует UpdateAttribute процессор Подайте отношение успеха из PutHDFS

Добавить новое свойство в UpdateAttributeпроцессор как

имя файла

${filename:replaceAll('<regex_expression>','<replacement_value>')}

Использование функции replaceAll из языка выражений NiFi.

(или)

Использование замена Функция

имя файла

${filename:replaceAll('<search_string>','<replacement_value>')}

enter image description here

Язык выражений NiFi предлагает различные функции для работы со строками. См. эту ссылку для получения дополнительной документации, относящейся к языку выражений.

Я попробовал тот же точный скрипт, который был задан в Вопросе. с ExecuteScript процессор с Script Engine под Python и все работает как положено.

При использовании функции .replace и замене на ''

Выход:

enter image description here

Поскольку имя файла fn._COPYING_ изменилось на fn.

...