Groovy: как получить определенные файлы из HDFS на основе filePattern

Я хочу получить только те файлы из каталога HDFS, которые содержат определенное имя (я поместил несколько файлов ответов с таким именем 2017-090-0.1, 2017-090-0.2, 2017-090-0.3 и т. д. теперь я хочу быть уверен, что определенное количество потоковых файлов помещено в hdfs (Я ОЗНАЧАЮ, ЕСЛИ Я ОТПРАВЛЮ 3 ЗАПРОСА С СВЯЗАННЫМ ИМЯ, Я ДОЛЖЕН ПРОВЕРИТЬ, ЕСЛИ Я ПОСТАВИЛ ТРИ ОТВЕТА В HDFS) для этого случая я использую этот код ниже, НО ОН НЕ ПОЛУЧАЕТ ФАЙЛЫ есть несколько тем, которые меня интересуют:

  1. Возможно ли сделать эту задачу без groovy кода возможностями nifi?
  2. ЧТО Я ДОЛЖЕН ИЗМЕНИТЬ, ЧТОБЫ ЭТОТ КОД РАБОТАЛ?

    import org.apache.commons.io.IOUtils
    import java.nio.charset.StandardCharsets
    def flowFile= session.get(1);//  i  gues  it  will   return    list  of  
    flowfiles
    def name="";
    def  count=0;
    def  value=0;
    def  amount=0;
    List<FlowFile> flowFiles = new ArrayList<FlowFile>();
    for(def  n in  flowFile){
    name=n.getAttribute("realName")
    count=n.getAttribute("count")
      value=count as  Number
      value=Math.round(value)
    }
    session.remove(flowFile)
    def findFileRecursive( String directoryName, String filePattern) {
    def fileFound
    def directory = new File(directoryName)
    if (directory.isDirectory()){
    def findFilenameClosure = { if (filePattern.matcher(it.name).find()){  fileFound = it } }
    directory.eachFileRecurse(findFilenameClosure)
    }
    amount++;
    flowFiles.add(fileFound);
    return fileFound
    }
    String filePattern=filePattern.contains(name)
    String  directoryName="/group/test/userDate";
    findFileRecursive(directoryName,filePattern);
    
    if(amount==count){
    for(def m in flowFiles){
    session.transfer(m,REL_SUCCESS);
    }
    
    }
    

person Omega    schedule 24.10.2017    source источник


Ответы (1)


Вы можете использовать процессор GetHDFS, который извлечет эти файлы из хранилища HDFS с проверенным рабочим кодом и направит полученный потоковый файл в отношения success или failure. Вам не нужно писать какой-либо пользовательский код для выполнения этой задачи. Затем PutHDFS при необходимости выполнит обратную запись в HDFS.

person Andy    schedule 24.10.2017
comment
как я могу использовать filepattern в getHdfs, как я помню, я могу только написать адрес каталога и детали конфигурации hadoop - person Omega; 25.10.2017
comment
Мне нужно восстановить файл, имя которого содержит такую ​​строку: 2017-01-01, как я могу написать в GetHdfs - person Omega; 25.10.2017
comment
Просто я могу написать что-то подобное, когда я получил потоковые файлы от процессора getHdfs if(flowFile.getAttribute('filename').substring(0,10)==2017-01-01){session.transfer(flowfile,REL_SUCCESS)}else {сессия.rollback(flowFile)} - person Omega; 25.10.2017
comment
Существует свойство под названием Регулярное выражение файлового фильтра. Вам нужно будет предоставить ему значение, такое как \d{4}\-\d{2}\-\d{2}, которое будет соответствовать любой последовательности из 4 цифр, затем тире, затем 2 цифр, тире и еще 2 цифр. - person Andy; 25.10.2017
comment
Если вы хотите сопоставить определенную строку символов, просто укажите их как литералы, экранируя символы -. Пример: 2017\-01\-01 - person Andy; 25.10.2017