在創建表/文件遷移作業時,CDM支持在源端和目的端的以下參數中配置時間宏變量:
- 源目錄
- 源端的表名
- 目的端的寫入目錄
- 目的端的表名
- Where子句
支持通過宏定義變量表示符“${}”來完成時間類型的宏定義,當前支持兩種類型:dateformat和timestamp。
通過時間宏變量+定時執行作業,可以實現數據庫增量同步和文件增量同步。
dateformat
dateformat支持兩種形式的參數:
- dateformat(format)
format表示返回日期的格式,格式定義參考“java.text.SimpleDateFormat.java”中的定義。
例如當前日期為“2017-10-16m09:00:00”,則“yyyy-MM-dd HH:mm:ss”表示“2017-10-16 09:00:00”。
- dateformat(format, dateOffset,dateType)
?format表示返回日期的格式。
?dateOffset表示日期的偏移量。
?dateType表示日期的偏移量的類型。
目前dateType支持以下幾種類型:SECOND(秒),MINUTE(分鐘),HOUR(小時),DAY(天)。
例如當前日期為“2017-10-16m09:00:00”,則:
?“dateformat(yyyy-MM-dd HH:mm:ss, -1, DAY)”表示當前時間的前一天,也就是“2017-10-15 09:00:00”。
?“dateformat(yyyy-MM-dd HH:mm:ss, -1, HOUR)”表示當前時間的前一小時,也就是“2017-10-16 08:00:00”。
?“dateformat(yyyy-MM-dd HH:mm:ss, -1, MINUTE)”表示當前時間的前一分鐘,也就是“2017-10-16 08:59:00”。
?“dateformat(yyyy-MM-dd HH:mm:ss, -1, SECOND)”表示當前時間的前一秒,也就是“2017-10-16 08:59:59”。
timestamp
timestamp支持兩種形式的參數:
- timestamp()
返回當前時間的時間戳,即從1970年到現在的毫秒數,如1508078516286。
- timestamp(dateOffset, dateType)
返回經過時間偏移后的時間戳,“dateOffset”和“dateType”表示日期的偏移量以及偏移量的類型。
例如當前日期為“2017-10-16m09:00:00”,則“timestamp(-10,MINUTE)”返回當前時間點10分鐘前的時間戳,即“1508115000000”。
時間變量宏定義具體展示
假設當前時間為“2017-10-16 09:00:00”,時間變量宏定義具體如下表“時間變量宏定義具體展示”所示。
| 宏變量 | 含義 | 實際顯示效果 |
|---|---|---|
| ${dateformat(yyyy-MM-dd)} | 以yyyy-MM-dd格式返回當前時間。 | 2017-10-16 |
| ${dateformat(yyyy/MM/dd)} | 以yyyy/MM/dd格式返回當前時間。 | 2017/10/16 |
| ${dateformat(yyyy_MM_dd HH:mm:ss)} | 以yyyy_MM_dd HH:mm:ss格式返回當前時間。 | 2017_10_16 09:00:00 |
| ${dateformat(yyyy-MM-dd HH:mm:ss, -1, DAY)} | 以yyyy-MM-dd HH:mm:ss格式返回時間,時間為當前時間的前一天。 | 2017-10-15 09:00:00 |
| ${timestamp()} | 返回當前時間的時間戳,即1970年1月1日(00:00:00 GMT)到當前時間的毫秒數。 | 1508115600000 |
| ${timestamp(-10, MINUTE)} | 返回當前時間點10分鐘前的時間戳。 | 1508115000000 |
| ${timestamp(dateformat(yyyyMMdd))} | 返回今天0點的時間戳。 | 1508083200000 |
| ${timestamp(dateformat(yyyyMMdd,-1,DAY))} | 返回昨天0點的時間戳。 | 1507996800000 |
| ${timestamp(dateformat(yyyyMMddHH))} | 返回當前整小時的時間戳。 | 1508115600000 |
路徑和表名的時間宏變量
如下圖“源表名和寫入目錄配置為時間宏變量所示”,如果將:
- 源端的“表名”配置為“CDM_/${dateformat(yyyy-MM-dd)}”。
- 目的端的“寫入目錄”配置為“/opt/ttxx/${timestamp()}”。
經過宏定義轉換,這個作業表示:將Oracle數據庫的“SQOOP.CDM_20171016”表中數據,遷移到HDFS的“/opt/ttxx/1508115701746”目錄中。
圖

目前也支持一個表名或路徑名中有多個宏定義變量,例如“/opt/ttxx/ {dateformat(yyyy-MM-dd)}/ {timestamp()}”,經過轉換后為“/opt/ttxx/2017-10-16/1508115701746”。
Where子句中的時間宏變量
以SQOOP.CDM_20171016表為例,該表中存在表示時間的列DS,如下圖“表數據”所示:

假設當前時間為“2017-10-16”,要導出前一天的數據(即DS=‘2017-10-15’),則可以在創建作業時配置“Where子句”為 DS='${dateformat(yyyy-MM-dd,-1,DAY)}' ,即可將符合DS=‘2017-10-15’條件的數據導出。
時間宏變量和定時任務配合完成增量同步
這里列舉兩個簡單的使用場景:
- 數據庫表中存在表示時間的列DS,類型為“varchar(30)”,插入的時間格式類似于“2017-xx-xx”。
定時任務中,重復周期為1天,每天的凌晨0點執行定時任務。配置“Where子句”為 DS='${dateformat(yyyy-MM-dd,-1,DAY)}' ,這樣就可以在每天的凌晨0點導出前一天產生的所有數據。
- 數據庫表中存在表示時間的列time,類型為“Number”,插入的時間格式為時間戳。
定時任務中,重復周期為1天,每天的凌晨0點執行定時任務。配置“Where子句”為 **time between **{timestamp(-1,DAY)} and {timestamp()} ,這樣就可以在每天的凌晨0點導出前一天產生的所有數據。
其它的配置方式原理相同。