我有一个Oozie工作流程,需要能够使用不同的日期格式。例如,假设我在2015年1月16日使用job.properties中的属性runDate=20150116
运行工作流。我希望能够在Oozie操作中自动使用以下路径:
external-file-20150116.csv
和其他一些名为:
的数据/rootDir/resource/150116/*
第一个例子很简单,我只是简单地提到:
external-file-${runDate}.csv
但第二个例子是不可能的。
我只能找到Oozie的内置EL时间戳()函数,因为它是固定格式并且不提供操作,所以没有用。似乎使用协调器可以解决问题,因为我能够使用所有漂亮的coord
EL函数。但是我偶尔需要临时运行此工作流程,在这种情况下我会使用job.properties文件,而不是协调员。
关于如何在不使用协调员的情况下操作日期的任何建议?
答案 0 :(得分:1)
有三种输入oozie作业属性的方法。
在您的用例中,您可以在oozie命令行中添加如下内容
-DrunDate=`date +%Y%m%d`
答案 1 :(得分:1)
经过大量的研究和研究,我找到了以下解决方案。与其他答案不同,它不需要将每个所需日期格式的一个变量插入到作业中。我的解决方案基于使用EL function - 基本上是UDF,但是对于Oozie。
创建EL函数以允许日期修改其格式。 EL函数是用Java编写的,与Hive不同,UDF不需要任何类扩展,尽管Oozie调用的任何方法都应该是静态的。
此方法的代码为:
package org.watsonb.elfunctions;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class DateEL {
public static String convertDate(String inputDate, String inputDateFormat, String outputDateFormat) {
DateTimeFormatter formatter = DateTimeFormat.forPattern(inputDateFormat);
DateTime dateTime = formatter.parseDateTime(inputDate);
formatter = DateTimeFormat.forPattern(outputDateFormat);
return formatter.print(dateTime);
}
}
构建此类,并将生成的jar文件放在O /var/lib/oozie
的Oozie服务器框中。
在Ambari的Oozie配置页面上,在oozie.service.ELService.ext.functions.workflow
选项卡中创建或查找Custom oozie-site.xml
属性,并添加以下内容(如果已存在,请用逗号分隔每个函数声明):
convertDateEl=org.watsonb.elfunctions.DateEL#convertDate
在这个例子中:
convertDateEl
是将在Oozie工作流程中调用的函数的名称,org.watsonb.elfunctions.DateEL
是完整的类路径,convertDate
是该类中方法的名称。如果不使用Ambari,请将该属性添加到oozie-site.xml
。
重新启动Oozie服务。该功能现在可用于任何Oozie工作流程。
在工作流程内,请致电:
${convertDateEl(runDate, "yyyyMMdd", "yy-MM-dd")}
返回格式化日期。例如:
<arg>/output/telephone-records-${convertDate(runDate, "yyyyMMdd", "yy-MM-dd")}.csv</arg>
在运行时会变成:
<arg>/output/telephone-records-12-09-30.csv</arg>
如果runDate为20120930
。
来源: http://blog.cloudera.com/blog/2013/09/how-to-write-an-el-function-in-apache-oozie/ - 我觉得这很有用,但有点过于冗长。