如何在OOZIE决策节点中使用逻辑运算符?

时间:2016-09-21 13:06:58

标签: shell hadoop oozie oozie-coordinator cloudera-quickstart-vm

我首先要求,我必须在给定的HDFS位置检查文件是否存在。

如果文件存在,那么我必须测试大于200字节的文件大小。

基于这两个结果我必须向用户发送电子邮件通知。

我可以使用以下代码

检查文件是否存在
${fs:exists("/user/cloudera/trdat/test.txt")}

我可以借助以下代码检查文件大小

${fs:fileSize("/user/cloudera/trdat/test.txt") gt 200 * B}

我必须创建一个工作流来检查文件是否存在(如果不存在)向用户发送电子邮件通知"file is not exist",如该消息。

如果存在则我们必须检查文件大小是否大于200字节。如果不是,我必须像"file is exist but no data"那样发送电子邮件通知。

请帮助我。

在这种情况下如何使用逻辑运算符(&&,||)?

如何处理这种情况?

2 个答案:

答案 0 :(得分:1)

oozie EL函数/表达式使用JSP表达式语言语法。 from oozie's doc

您可以查看JSP 2.0 specification以获取语法。

特别针对您的问题,答案是:

<decision name="node_name">
  <switch>
    <case to="node_1">
      ${(fs:exists("/user/cloudera/trdat/test.txt"))
         and
        (fs:fileSize("/user/cloudera/trdat/test.txt") gt 200 * B)}
    /case>
    <default to="end"/>
  </switch>
</decision>

答案 1 :(得分:0)

首先我们需要检查决策一,即文件是否存在。

如果不存在,则默认文件缺少通知。

如果只存在文件,我们必须检查文件的大小。

如果文件大小小于给定大小,那么我们只需要发送失败通知。

通过以下代码的帮助,我们可以实现上述功能。

<decision name="decision1">
       <switch>
         <case to="day0">
          ${fs:exists("/user/cloudera/trdat/test.txt")}
         </case>
        <default to="FileMissing" />
       </switch>
  </decision>

 <action name="day0">
   <email xmlns="uri:oozie:email-action:0.1">
   <to>......</to>
   <subject>.....</subject>
   </email>
  <ok to="decision2"/>
  <error to="end"/>
 </action>

 <action name="FileMissing">
 ................................
</action>

 <decision name="decision2">
       <switch>
         <case to="day1">
         ${fs:fileSize("/user/cloudera/trdat/test.txt") gt 200 * B}
         </case>
        <default to="DATAMissing" />
       </switch>
  </decision>
   <action name="day1">
   <email xmlns="uri:oozie:email-action:0.1">
   <to>......</to>
   <subject>.....</subject>
   </email>
  <ok to="Ok"/>
  <error to="end"/>
 </action>

 <action name="DATAMissing">
 ................................
</action>