我正在寻找实现以下目标的正确方法:
情景:
连接器正在为数据提供数据,并且它正在hdfs中的路径/data/2015/09/15/csvfile.csv
处存储。 (明天存放)
我的协调员工作在当天结束时在2015-09-15T23:59运行,并使用上述路径中的当天数据并将其存储到分区day = 16
下的hive表中
基本上我想让每个分区保存最后一天的数据,如果数据可用,如果数据不可用则不应该创建分区。
例如
收集的第15个数据应该类似地存储到分区16中
第16个数据分为第17个分区等等。
假设从2015-09-15T00:00
开始喂食,直到2015-09-16T00:00
,这一天已满,并存储在路径/data/2015/09/15/file.csv
协调器作业在2015-09-15T23:59
处实现,它应该使用/data/2015/09/15/file.csv
路径中的数据并将其作为输入传递给协调器操作。
以下是我使用的oozie协调程序文件正在运行,但是当协调员没有特定日期可用的数据时,它没有给出预期的输出。
协调员xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<coordinator-app name="App" frequency=1440 start=2015-09-15T23:59Z end=2015-09-30T23:59Z timezone="UTC" xmlns="uri:oozie:coordinator:0.4">
<datasets>
<dataset name="logs" frequency=1440 initial-instance=2015-09-15T23:59Z timezone="UTC">
<uri-template>${DataPath}/${YEAR}/${MONTH}/${DAY}</uri-template>
<done-flag>file.csv</done-flag>
</dataset>
</datasets>
<input-events>
<data-in name="isready_logs" dataset="logs">
<instance>${coord:current(0)}</instance>
</data-in>
</input-events>
<action>
<workflow>
<app-path>${ApplicationPath}/log_wf.xml</app-path>
<configuration>
<property>
<name>currentday</name>
<value>${coord:formatTime(coord:dateOffset(coord:nominalTime(), 1, 'DAY'), 'dd')}</value>
</property>
<property>
<name>currentmonth</name>
<value>${coord:formatTime(coord:nominalTime(), 'MM')}</value>
</property>
<property>
<name>currentyear</name>
<value>${coord:formatTime(coord:nominalTime(), 'yyyy')}</value>
</property>
<property>
<name>input</name>
<value>${coord:dataIn('isready_logs')}</value>
</property>
<property>
<name>ScriptPath</name>
<value>${ApplicationPath}</value>
</property>
<property>
<name>XmlPath</name>
<value>${ApplicationPath}</value>
</property>
</configuration>
</workflow>
</action>
</coordinator-app>
您能指导我使用正确的值配置协调器吗?
提前致谢。
答案 0 :(得分:0)
您的偏移量加一天,但仅限于当天,而不是当前年份或当前月份。
这意味着,对于在2015-09-15T23:59
处实现的协调员作业,日期将为2015-09-16
。但对于在2015-12-31T23:59
实现的协调员工作,该日期将为2015-12-01`
如果您想使用偏移量,则应将该偏移量添加到月份和年份,否则它将在月末和年末计算错误的日期。
<value>${coord:formatTime(coord:dateOffset(coord:nominalTime(), 1, 'DAY'), 'dd')}</value>
...
<value>${coord:formatTime(coord:dateOffset(coord:nominalTime(), 1, 'DAY'), 'MM')}</value>
...
<value>${coord:formatTime(coord:dateOffset(coord:nominalTime(), 1, 'DAY'), 'yyyy')}</value>