在 Oozie 中访问和操作日期
Accessing and manipulating the date in Oozie
我有一个 Oozie 工作流程,它需要能够使用不同的日期格式。例如,假设我在 2015 年 1 月 16 日 运行 使用 job.properties 中的 属性 runDate=20150116
设置工作流。我希望能够在 Oozie 操作中自动使用以下路径:
external-file-20150116.csv
和其他一些名为的数据:
/rootDir/resource/150116/*
第一个例子就很简单了,我就简单参考一下:
external-file-${runDate}.csv
但是第二个例子是不可能的。
我只能找到 Oozie 的内置 EL timestamp() 函数,该函数没有用,因为它是固定格式并且不提供任何操作。似乎使用协调器可以解决问题,因为我可以使用所有不错的 coord
EL 函数。但是,我偶尔需要 运行 这个工作流程,在临时的基础上,在这种情况下,我会使用 job.properties 文件而不是协调器。
关于如何在不使用协调器的情况下操纵日期的任何建议?
有 3 种方法可以输入 oozie 作业 属性。
- 作业属性文件,由oozie用户在运行一个作业
时提交
- config-default.xml,在与workflow.xml(或coordinator.xml / bundle.xml)相同的HDFS路径下。通常用于指定默认作业属性。
- oozie CLI 的-D 选项。
在您的用例中,您可以将如下内容添加到 oozie 命令行
-DrunDate=`date +%Y%m%d`
经过大量的折腾和研究,我找到了以下解决方案。与其他答案不同,它不需要将每个所需日期格式的变量插入到作业中。我的解决方案是基于使用 EL function - 基本上是 UDF 但对于 Oozie。
解决方案
创建一个 EL 函数以允许修改日期的格式。 EL 函数是用 Java 编写的,与 Hive UDF 不同,它不需要任何 class 扩展,尽管 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);
}
}
构建这个 class,并将生成的 jar 文件放在 Oozie 服务器框的 /var/lib/oozie
中。
在 Ambari 的 Oozie 配置页面上,在 Custom oozie-site.xml
选项卡中创建或找到 oozie.service.ELService.ext.functions.workflow
属性,并添加以下内容(如果已经存在,请将每个函数声明用逗号):
convertDateEl=org.watsonb.elfunctions.DateEL#convertDate
在这个例子中:
convertDateEl
是将在 Oozie 工作流中调用的函数的名称,
org.watsonb.elfunctions.DateEL
是完整的 class 路径,
convertDate
是class中的方法名。
如果不使用 Ambari,请将 属性 添加到 oozie-site.xml
。
重新启动 Oozie 服务。该功能现在可用于任何 Oozie 工作流程。
用法
在工作流中,调用:
${convertDateEl(runDate, "yyyyMMdd", "yy-MM-dd")}
到return一个格式化的日期。例如:
<arg>/output/telephone-records-${convertDate(runDate, "yyyyMMdd", "yy-MM-dd")}.csv</arg>
会在运行时变成:
<arg>/output/telephone-records-12-09-30.csv</arg>
如果运行日期是 20120930
。
来源: http://blog.cloudera.com/blog/2013/09/how-to-write-an-el-function-in-apache-oozie/ - 我发现这很有用,但有点太冗长了。
我有一个 Oozie 工作流程,它需要能够使用不同的日期格式。例如,假设我在 2015 年 1 月 16 日 运行 使用 job.properties 中的 属性 runDate=20150116
设置工作流。我希望能够在 Oozie 操作中自动使用以下路径:
external-file-20150116.csv
和其他一些名为的数据:
/rootDir/resource/150116/*
第一个例子就很简单了,我就简单参考一下:
external-file-${runDate}.csv
但是第二个例子是不可能的。
我只能找到 Oozie 的内置 EL timestamp() 函数,该函数没有用,因为它是固定格式并且不提供任何操作。似乎使用协调器可以解决问题,因为我可以使用所有不错的 coord
EL 函数。但是,我偶尔需要 运行 这个工作流程,在临时的基础上,在这种情况下,我会使用 job.properties 文件而不是协调器。
关于如何在不使用协调器的情况下操纵日期的任何建议?
有 3 种方法可以输入 oozie 作业 属性。
- 作业属性文件,由oozie用户在运行一个作业 时提交
- config-default.xml,在与workflow.xml(或coordinator.xml / bundle.xml)相同的HDFS路径下。通常用于指定默认作业属性。
- oozie CLI 的-D 选项。
在您的用例中,您可以将如下内容添加到 oozie 命令行
-DrunDate=`date +%Y%m%d`
经过大量的折腾和研究,我找到了以下解决方案。与其他答案不同,它不需要将每个所需日期格式的变量插入到作业中。我的解决方案是基于使用 EL function - 基本上是 UDF 但对于 Oozie。
解决方案
创建一个 EL 函数以允许修改日期的格式。 EL 函数是用 Java 编写的,与 Hive UDF 不同,它不需要任何 class 扩展,尽管 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);
}
}
构建这个 class,并将生成的 jar 文件放在 Oozie 服务器框的 /var/lib/oozie
中。
在 Ambari 的 Oozie 配置页面上,在 Custom oozie-site.xml
选项卡中创建或找到 oozie.service.ELService.ext.functions.workflow
属性,并添加以下内容(如果已经存在,请将每个函数声明用逗号):
convertDateEl=org.watsonb.elfunctions.DateEL#convertDate
在这个例子中:
convertDateEl
是将在 Oozie 工作流中调用的函数的名称,org.watsonb.elfunctions.DateEL
是完整的 class 路径,convertDate
是class中的方法名。
如果不使用 Ambari,请将 属性 添加到 oozie-site.xml
。
重新启动 Oozie 服务。该功能现在可用于任何 Oozie 工作流程。
用法
在工作流中,调用:
${convertDateEl(runDate, "yyyyMMdd", "yy-MM-dd")}
到return一个格式化的日期。例如:
<arg>/output/telephone-records-${convertDate(runDate, "yyyyMMdd", "yy-MM-dd")}.csv</arg>
会在运行时变成:
<arg>/output/telephone-records-12-09-30.csv</arg>
如果运行日期是 20120930
。
来源: http://blog.cloudera.com/blog/2013/09/how-to-write-an-el-function-in-apache-oozie/ - 我发现这很有用,但有点太冗长了。