0

我有第一个要求,我必须检查文件是否存在或不在给定的HDFS位置。如何在OOZIE决策节点中使用逻辑运算符?

如果文件存在,那么我必须测试大于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"这样的邮件的电子邮件通知。

请帮助我。

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

如何处理这种情况?

+0

的可能的复制[如何在Oozie的工作流中使用逻辑运算符(http://stackoverflow.com/questions/33957236/how-to-use -logical-operators-in-oozie-workflow) – YoungHobbit

+0

你的问题很混乱,显然,你也是。你有3种不同的情况,有明确的优先权。所以你需要3个分支的决定“如果不存在,转到SendMailA;如果太小,转到SendMailB;转到结束”。在这种情况下不需要和/或操作员。 –

+0

谢谢您的回复@YoungHobbit,Samson Scharfrichter。我得到了解决方案 –

回答

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> 
0

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>