Groovy:如何基于filePattern从HDFS获取某些文件

Groovy:如何基于filePattern从HDFS获取某些文件,groovy,apache-nifi,Groovy,Apache Nifi,我只想从包含特定名称的HDFS目录中获取这些文件(我已经放置了几个名为2017-090-0.1的响应文件, 2017-090-0.22017-090-0.3等。现在我想确保一定数量的流文件放在hdfs中(我的意思是,如果我发送3个带有相关名称的请求,我必须检查我是否在hdfs中放了三个响应)对于本例,我使用下面的代码,但它无法获取文件。我感兴趣的有几个子弹出: 是否可以通过nifi功能在没有groovy代码的情况下完成此任务 我应该做些什么更改才能使此代码正常工作 import org.apac

我只想从包含特定名称的HDFS目录中获取这些文件(我已经放置了几个名为2017-090-0.1的响应文件, 2017-090-0.22017-090-0.3等。现在我想确保一定数量的流文件放在hdfs中(我的意思是,如果我发送3个带有相关名称的请求,我必须检查我是否在hdfs中放了三个响应)对于本例,我使用下面的代码,但它无法获取文件。我感兴趣的有几个子弹出:

  • 是否可以通过nifi功能在没有groovy代码的情况下完成此任务
  • 我应该做些什么更改才能使此代码正常工作

    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);
    }
    
    }
    
    import org.apache.commons.io.IOUtils
    导入java.nio.charset.StandardCharset
    def flowFile=session.get(1);//它将返回
    流文件
    def name=“”;
    def计数=0;
    def值=0;
    def数量=0;
    List flowFiles=new ArrayList();
    用于(流文件中的def n){
    name=n.getAttribute(“realName”)
    count=n.getAttribute(“count”)
    值=计数为数字
    值=数学四舍五入(值)
    }
    删除会话(流文件)
    def findFileRecursive(字符串目录名、字符串文件模式){
    找到def文件
    def目录=新文件(目录名)
    if(directory.isDirectory()){
    def findFilenameClosure={if(filePattern.matcher(it.name.find()){filefind=it}}
    目录.eachFileRecurse(findFilenameClosure)
    }
    金额++;
    添加(fileFound);
    找到返回文件
    }
    String filePattern=filePattern.contains(名称)
    字符串directoryName=“/group/test/userDate”;
    findFileRecursive(目录名、文件模式);
    如果(金额==计数){
    用于(流文件中的def m){
    会话。转移(m,REL_SUCCESS);
    }
    }
    

  • 您可以使用
    GetHDFS
    处理器,该处理器将使用可验证的工作代码从HDFS存储器中检索这些文件,并将生成的流文件路由到
    success
    failure
    关系。您不需要编写任何自定义代码来执行此任务。
    PutHDFS
    随后将执行写入操作如有必要,切换到HDFS。

    您可以使用
    GetHDFS
    处理器,该处理器将使用可验证的工作代码从HDFS存储中检索这些文件,并将生成的流文件路由到
    成功
    失败
    关系。您不需要编写任何自定义代码来执行此任务。
    PutHDFS
    w如果有必要,我将执行回写HDFS。

    我记得我只能写目录地址和hadoop配置详细信息,我如何在getHdfs中使用filepattern?我需要检索文件名,其中包含如下字符串:“2017-01-01”,如何在getHdfs中写入?简单地说,当我从getHdfs处理器获取流文件时,如果(flowFile.getAttribute('filename')。子字符串(0,10)=“2017-01-01”){session.transfer(flowFile,REL_SUCCESS)}或者{session.rollback(flowFile)},我可以这样写吗有一个名为File Filter Regex的属性。您需要为它提供一个值,如
    \d{4}-\d{2}-\d{2}
    它将匹配任何一系列的4位数字,然后是一个破折号,然后是2位数字、一个破折号和2个以上的数字。如果要匹配特定的字符串,只需将它们作为文本提供,并转义
    -
    字符。例如:
    2017 \-01 \-01
    我记得我只能直接写入,如何在getHdfs中使用filepatternory地址和hadoop配置详细信息我需要检索包含如下字符串的文件名:“2017-01-01”,我如何在getHdfs中写入简单地说,当我从getHdfs处理器获得flowfiles时,如果(flowFile.getAttribute('filename')。子字符串(0,10)=“2017-01-01”),我可以这样写吗{session.transfer(flowfile,REL_SUCCESS)}else{session.rollback(flowfile)}有一个名为File Filter Regex的属性。您需要为它提供一个类似
    \d{4}-\d{2}-\d{2}的值
    它将匹配任何一系列的4位数字,然后是一个破折号,然后是2位数字、一个破折号和2个以上的数字。如果要匹配特定的字符串,只需将它们作为文本提供,并转义
    -
    字符。示例:
    2017 \-01 \-01