как использовать логические операторы в узле принятия решений OOZIE?

У меня есть требование, как первое, я должен проверить, существует ли файл или нет в данном месте 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", как это сообщение.

Пожалуйста помоги мне с этим.

как использовать логические операторы (&&,||) в этом случае?

как обрабатывать эти сценарии?


person Sai    schedule 21.09.2016    source источник
comment
Возможный дубликат как использовать логические операторы в рабочем процессе OOZIE   -  person YoungHobbit    schedule 21.09.2016
comment
Ваш вопрос очень запутан, и, видимо, вы тоже. У вас есть 3 разных дела с четким приоритетом. Таким образом, вам нужно решение с 3 ветвями, чтобы перейти к SendMailA, если оно не существует; перейти к SendMailB, если он слишком мал; перейти к концу. В этом случае нет необходимости в операторах и/или.   -  person Samson Scharfrichter    schedule 21.09.2016
comment
Спасибо за быстрый ответ @YoungHobbit, Самсон Шарфрихтер. я нашел решение   -  person Sai    schedule 21.09.2016


Ответы (2)


Функции/выражения oozie EL используют синтаксис JSP Expression Language. из документа Узи

Вы можете проверить спецификация JSP 2.0, чтобы получить синтаксис.

Конкретно на ваш вопрос ответ такой:

<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>
person Y.G.    schedule 27.01.2017

Сначала нам нужно проверить решение одно, то есть файл существует или нет.

Если файл не существует, уведомление об отсутствии файла по умолчанию.

Если файл существует только тогда, мы должны проверить размер файла.

если размер файла меньше заданного размера, то только мы должны отправить уведомление об ошибке.

с помощью приведенного ниже кода мы можем достичь вышеуказанной функциональности.

<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>  
person Sai    schedule 21.09.2016