2012-05-01 29 views
0

在我的數據處理場景我有「YY」一年格式一些源數據路徑郵戳:表達式語言得到格式化Oozie的同步數據集定義

/user/${user.name}/${YEAR我知道這是一個糟糕的設計,因爲'YY'到最後,而YEAR已經存在於路徑中,但這是它在我們當前的系統中的作用,我們不能改變它一段時間。

<datasets> 
    <dataset name="hourlyds" frequency="${ds_frequency}" 
     initial-instance="${ds_initial_instance}" timezone="${ds_timezone}"> 

     <uri-template>${baseFsURI}/${YEAR}/${MONTH}/${DAY}/alpha_${coord:formatTime(coord:actualTime(),'yy')}</uri-template> 
     OR (tried one at a time) 
     <uri-template>${baseFsURI}/${YEAR}/${MONTH}/${DAY}/alpha_${coord:formatTime(coord:nominalTime(),'yy')}</uri-template> 

     <done-flag>${doneFlag}</done-flag> 
    </dataset> 
</datasets> 

2個EL都沒有工作。即使是一個非嵌套的,沒有任何數據名稱前綴EL表達式失敗:

<uri-template>${baseFsURI}/${YEAR}/${MONTH}/${DAY}/${coord:nominalTime()}</uri-template> 

每次它拋出以下錯誤時間:

Error: E1004: Expression language evaluation error [Unable to evaluate :${baseFsURI}/${YEAR}/${MONTH}/${DAY}/${coord:nominalTime()}: ], java.lang.Exception: Unable to evaluate :${baseFsURI}/${YEAR}/${MONTH}/${DAY}/${coord:nominalTime()}: 

我如何得到這個「YY」中的數據集的格式? EL以外的任何方式都可以實現它?

在此先感謝,

拉胡爾

回答

0

你不能把COORDS數據集中的元素,而它們在輸入事件或輸出事件存在描述相對於當前的時間戳格式化時使用您的模板網址的網址

路徑/user/${user.name}/${YEAR}/${MONTH}/${DAY}/some dataset name_YY包含文件的文件或目錄?

如果它自己的文件,然後修改數據集去除some dataset name_YY - Hadoop的會解釋$ {DAY}文件夾輸入爲一個目錄,並使用它的所有文件作爲輸入

如果他們的目錄和你只是在一個時間的$ {DAY}文件夾中只包含一個目錄(有些數據集YY)處理$ {DAY}文件夾,那麼你就可以在你的行動中使用通配符:

<action> 
    <workflow> 
     <app-path>${wf_app_path}</app-path> 
     <configuration> 
      <property> 
      <name>wfInput</name> 
      <value>${coord:dataIn('input')}/*</value> 
     </property> 
     <property> 
      <name>wfOutput</name> 
      <value>${coord:dataOut('output')}</value> 
     </property> 
     </configuration> 
    </workflow> 
    </action> 
+0

感謝回答克里斯。實際上,我在問題中提到的是一個目錄,$ {DAY}中可以有多個這樣的目錄。 – rahul67

+0

因此,使用' $ {coord:dataIn('hourlyds')} /某些數據集名稱_ *'。這確實意味着你不能使用doneflag元素,儘管 –

+0

沒錯。顯然,我們需要更好地將我們的系統標準化以獲得更好的數據路徑,除非Oozie也將這個EL特徵帶入數據集標籤中。 – rahul67