我已经创建了一个oozie协调器,它在启动之前依赖于一个数据集。由于我们在澳大利亚,我已将时区偏移设置为墨尔本,数据频率设置为10分钟。
我试图让tzoffset()el函数返回澳大利亚时区偏移量,但输入数据集仍然是utc时间。
以下是协调员的定义
<coordinator-app name="My_Coordinator55"
frequency="0,10,20,30,40,50 * * * *"
start="${start_date}" end="${end_date}" timezone="Australia/Sydney"
xmlns="uri:oozie:coordinator:0.2"
>
<controls>
<execution>FIFO</execution>
</controls>
<datasets>
<dataset name="inputpath" frequency="${coord:minutes(10)}"
initial-instance="2016-04-08T04:00Z" timezone="Australia/Melbourne">
<uri-template>${nameNode}/user/hive/warehouse/InputDir${YEAR}${MONTH}${DAY}${HOUR}${MINUTE}</uri-template>
<done-flag></done-flag>
</dataset>
</datasets>
<input-events>
<data-in name="inputpath" dataset="inputpath">
<instance>${coord:current(coord:tzOffset()/10)}</instance>
</data-in>
</input-events>
<action>
<workflow>
<app-path>${wf_application_path}</app-path>
<configuration>
<property>
<name>inputpath</name>
<value>${coord:dataIn('inputpath')}</value>
</property>
<property>
<name>tablename</name>
<value>Output${coord:formatTime( coord:dateTzOffset(coord:nominalTime(), "Australia/Melbourne"), 'yyyyMMddHHmm')}</value>
</property>
<property>
<name>oozie.use.system.libpath</name>
<value>True</value>
</property>
<property>
<name>start_date</name>
<value>2016-04-08T04:00Z</value>
</property>
<property>
<name>end_date</name>
<value>2016-10-15T23:14Z</value>
</property>
</configuration>
</workflow>
</action>
</coordinator-app>
下面是我运行协调器时的结果。对于2016-04-08的名义时间14:00(墨尔本时间)是指2016-04-08 04:00(-10小时是utc时间),尽管我有
<instance>${coord:current(coord:tzOffset()/10)}</instance>
计划的工作流程和所需的输入
1条答案
按热度按时间f1tvaqid1#
我终于找到了答案,所以只是张贴了帮助下一个时区夏时制受害者的oozie。
在oozie中定义tzoffset()[注意字母的大小写,还有一个大写t的函数不适用于数据集]函数,它计算数据集和工作流时区之间的时区差。所以这里的el函数返回墨尔本(aest tz)和墨尔本偏离航线之间的0差!
因此,如果您要使用它来自动处理夏时制时差,那么技巧是将dataset的时区设置为utc,将coordinator(工作流)的时区设置为实际时间。
注意:我使用这个方法来帮助自动进行日光节约时间的更改。函数在冬季返回-600,夏季返回-660。使用除以10,因为数据集的频率设置为10分钟。