在創建表/文件遷移作業的字段映射界面,可新建字段轉換器,如下圖示。
圖 新建字段轉換器

說明當使用二進制格式進行文件到文件的遷移時,沒有字段映射這一步。
CDM可以在遷移過程中對字段進行轉換,目前支持以下字段轉換器:
- 脫敏
- 去前后空格
- 字符串反轉
- 字符串替換
- 去換行
- 表達式轉換
脫敏
隱藏字符串中的關鍵信息,例如要將“12345678910”轉換為“123****8910”,則配置如下:
- “起始保留長度”為“3”。
- “結尾保留長度”為“4”。
- “替換字符”為“*”。
詳見下圖:字段脫敏

去前后空格
自動去字符串前后的空值,不需要配置參數。
字符串反轉
自動反轉字符串,例如將“ABC”轉換為“CBA”,不需要配置參數。
字符串替換
替換字符串,需要用戶配置被替換的對象,以及替換后的值。
去換行
將字段中的換行符(\n、\r、\r\n)刪除。
表達式轉換
使用JSP表達式語言(Expression Language)對當前字段或整行數據進行轉換。JSP表達式語言可以用來創建算術和邏輯表達式。在表達式內可以使用整型數,浮點數,字符串,常量true、false和null。
表達式支持以下兩個環境變量:
- value:當前字段值。
- row:當前行,數組類型。
表達式支持以下工具類:
- StringUtils:字符串處理類,參考Java SDK代碼的包結構“org.apache.commons.lang.StringUtils”。
- DateUtils:日期工具類。
- CommonUtils:公共工具類。
- NumberUtils:字符串轉數值類。
- HttpsUtils:讀取網絡文件類。
應用舉例:
-
如果當前字段為字符串類型,將字符串全部轉換為小寫,例如將“aBC”轉換為“abc”。
表達式:StringUtils.lowerCase(value)
-
將當前字段的字符串全部轉為大寫。
表達式:StringUtils.upperCase(value)
-
如果當前字段值為“yyyy-MM-dd”格式的日期字符串,需要截取年,例如字段值為“2017-12-01”,轉換后為“2017”。
表達式:StringUtils.substringBefore(value,"-")
-
如果當前字段值為數值類型,轉換后值為當前值的兩倍。
表達式:value*2
-
如果當前字段值為“true”,轉換后為“Y”,其它值則轉換后為“N”。
表達式:value=="true"?"Y":"N"
-
如果當前字段值為字符串類型,當為空時,轉換為“Default”,否則不轉換。
表達式:empty value? "Default":value
-
如果想將日期字段格式從“2018/01/05 15:15:05”轉換為“2018-01-05 15:15:05”。
表達式:DateUtils.format(DateUtils.parseDate(value,"yyyy/MM/dd HH:mm:ss"),"yyyy-MM-dd HH:mm:ss")
-
獲取一個36位的UUID(Universally Unique Identifier,通用唯一識別碼)。
表達式:CommonUtils.randomUUID()
-
如果當前字段值為字符串類型,將首字母轉換為大寫,例如將“cat”轉換為“Cat”。
表達式:StringUtils.capitalize(value)
-
如果當前字段值為字符串類型,將首字母轉換為小寫,例如將“Cat”轉換為“cat”。
表達式:StringUtils.uncapitalize(value)
-
如果當前字段值為字符串類型,使用空格填充為指定長度,并且將字符串居中,當字符串長度不小于指定長度時不轉換,例如將“ab”轉換為長度為4的“ab”。
表達式:StringUtils.center(value,4)
-
刪除字符串末尾的一個換行符(包括“\n”、“\r”或者“\r\n”),例如將“abc\r\n\r\n”轉換為“abc\r\n”。
表達式:StringUtils.chomp(value)
-
如果字符串中包含指定的字符串,則返回布爾值true,否則返回false。例如“abc”中包含“a”,則返回true。
表達式:StringUtils.contains(value,"a")
-
如果字符串中包含指定字符串的任一字符,則返回布爾值true,否則返回false。例如“zzabyycdxx”中包含“z”或“a”任意一個,則返回true。
表達式:StringUtils.containsAny("value","za")
-
如果字符串中不包含指定的所有字符,則返回布爾值true,包含任意一個字符則返回false。例如“abz”中包含“xyz”里的任意一個字符,則返回false。
表達式:StringUtils.containsNone(value,"xyz")
-
如果當前字符串只包含指定字符串中的字符,則返回布爾值true,包含任意一個其它字符則返回false。例如“abab”只包含“abc”中的字符,則返回true。
表達式:StringUtils.containsOnly(value,"abc")
-
如果字符串為空或null,則轉換為指定的字符串,否則不轉換。例如將空字符轉換為null。
表達式:StringUtils.defaultIfEmpty(value,null)
-
如果字符串以指定的后綴結尾(包括大小寫),則返回布爾值true,否則返回false。例如“abcdef”后綴不為null,則返回false。
表達式:StringUtils.endsWith(value,null)
-
如果字符串和指定的字符串完全一樣(包括大小寫),則返回布爾值true,否則返回false。例如比較字符串“abc”和“ABC”,則返回false。
表達式:StringUtils.equals(value,"ABC")
-
從字符串中獲取指定字符串的第一個索引,沒有則返回整數-1。例如從“aabaabaa”中獲取“ab”的第一個索引1。
表達式:StringUtils.indexOf(value,"ab")
-
從字符串中獲取指定字符串的最后一個索引,沒有則返回整數-1。例如從“aFkyk”中獲取“k”的最后一個索引4。
表達式:StringUtils.lastIndexOf(value,"k")
-
從字符串中指定的位置往后查找,獲取指定字符串的第一個索引,沒有則轉換為“-1”。例如“aabaabaa”中索引3的后面,第一個“b”的索引是5。
表達式:StringUtils.indexOf(value,"b",3)
-
從字符串獲取指定字符串中任一字符的第一個索引,沒有則返回整數-1。例如從“zzabyycdxx”中獲取“z”或“a”的第一個索引0。
表達式:StringUtils.indexOfAny(value,"za")
-
如果字符串僅包含Unicode字符,返回布爾值true,否則返回false。例如“ab2c”中包含非Unicode字符,返回false。
表達式:StringUtils.isAlpha(value)
-
如果字符串僅包含Unicode字符或數字,返回布爾值true,否則返回false。例如“ab2c”中僅包含Unicode字符和數字,返回true。
表達式:StringUtils.isAlphanumeric(value)
-
如果字符串僅包含Unicode字符、數字或空格,返回布爾值true,否則返回false。例如“ab2c”中僅包含Unicode字符和數字,返回true。
表達式:StringUtils.isAlphanumericSpace(value)
-
如果字符串僅包含Unicode字符或空格,返回布爾值true,否則返回false。例如“ab2c”中包含Unicode字符和數字,返回false。
表達式:StringUtils.isAlphaSpace(value)
-
如果字符串僅包含ASCII可打印字符,返回布爾值true,否則返回false。例如“!ab-c~”返回true。
表達式:StringUtils.isAsciiPrintable(value)
-
如果字符串為空或null,返回布爾值true,否則返回false。
表達式:StringUtils.isEmpty(value)
-
如果字符串中僅包含Unicode數字,返回布爾值true,否則返回false。
表達式:StringUtils.isNumeric(value)
-
獲取字符串最左端的指定長度的字符,例如獲取“abc”最左端的2位字符“ab”。
表達式:StringUtils.left(value,2)
-
獲取字符串最右端的指定長度的字符,例如獲取“abc”最右端的2位字符“bc”。
表達式:StringUtils.right(value,2)
-
將指定字符串拼接至當前字符串的左側,需同時指定拼接后的字符串長度,如果當前字符串長度不小于指定長度,則不轉換。例如將“yz”拼接到“bat”左側,拼接后長度為8,則轉換后為“yzyzybat”。
表達式:StringUtils.leftPad(value,8,"yz")
-
將指定字符串拼接至當前字符串的右側,需同時指定拼接后的字符串長度,如果當前字符串長度不小于指定長度,則不轉換。例如將“yz”拼接到“bat”右側,拼接后長度為8,則轉換后為“batyzyzy”。
表達式:StringUtils.rightPad(value,8,"yz")
-
如果當前字段為字符串類型,獲取當前字符串的長度,如果該字符串為null,則返回0。
表達式:StringUtils.length(value)
-
如果當前字段為字符串類型,刪除其中所有的指定字符串,例如從“queued”中刪除“ue”,轉換后為“qd”。
表達式:StringUtils.remove(value,"ue")
-
如果當前字段為字符串類型,移除當前字段末尾指定的子字符串。指定的子字符串若不在當前字段的末尾,則不轉換,例如移除當前字段“www.daliqc.cn”后的“.cn”。
表達式:StringUtils.removeEnd(value,".cn")
-
如果當前字段為字符串類型,移除當前字段開頭指定的子字符串。指定的子字符串若不在當前字段的開頭,則不轉換,例如移除當前字段“www.daliqc.cn”前的“www.”。
表達式:StringUtils.removeStart(value,"www.")
-
如果當前字段為字符串類型,替換當前字段中所有的指定字符串,例如將“aba”中的“a”用“z”替換,轉換后為“zbz”。
表達式:StringUtils.replace(value,"a","z")
-
如果當前字段為字符串類型,一次替換字符串中的多個字符,例如將字符串“hello”中的“h”用“j”替換,“o”用“y”替換,轉換后為“jelly”。
表達式:StringUtils.replaceChars(value,"ho","jy")
-
如果字符串以指定的前綴開頭(區分大小寫),則返回布爾值true,否則返回false,例如當前字符串“abcdef”以“abc”開頭,則返回true。
表達式:StringUtils.startsWith(value,"abc")
-
如果當前字段為字符串類型,去除字段中所有指定的字符,例如去除“abcyx”中所有的“x”、“y”和“z”,轉換后為“abc”。
表達式:StringUtils.strip(value,"xyz")
-
如果當前字段為字符串類型,去除字段末尾所有指定的字符,例如去除當前字段末尾的所有空格。
表達式:StringUtils.stripEnd(value,null)
-
如果當前字段為字符串類型,去除字段開頭所有指定的字符,例如去除當前字段開頭的所有空格。
表達式:StringUtils.stripStart(value,null)
-
如果當前字段為字符串類型,獲取字符串指定位置后(不包括指定位置的字符)的子字符串,指定位置如果為負數,則從末尾往前計算位置。例如獲取“abcde”第2個字符后的字符串,則轉換后為“cde”。
表達式:StringUtils.substring(value,2)
-
如果當前字段為字符串類型,獲取字符串指定區間的子字符串,區間位置如果為負數,則從末尾往前計算位置。例如獲取“abcde”第2個字符后、第5個字符前的字符串,則轉換后為“cd”。
表達式:StringUtils.substring(value,2,5)
-
如果當前字段為字符串類型,獲取當前字段里第一個指定字符后的子字符串。例如獲取“abcba”中第一個“b”之后的子字符串,轉換后為“cba”。
表達式:StringUtils.substringAfter(value,"b")
-
如果當前字段為字符串類型,獲取當前字段里最后一個指定字符后的子字符串。例如獲取“abcba”中最后一個“b”之后的子字符串,轉換后為“a”。
表達式:StringUtils.substringAfterLast(value,"b")
-
如果當前字段為字符串類型,獲取當前字段里第一個指定字符前的子字符串。例如獲取“abcba”中第一個“b”之前的子字符串,轉換后為“a”。
表達式:StringUtils.substringBefore(value,"b")
-
如果當前字段為字符串類型,獲取當前字段里最后一個指定字符前的子字符串。例如獲取“abcba”中最后一個“b”之前的子字符串,轉換后為“abc”。
表達式:StringUtils.substringBeforeLast(value,"b")
-
如果當前字段為字符串類型,獲取嵌套在指定字符串之間的子字符串,沒有匹配的則返回null。例如獲取“tagabctag”中“tag”之間的子字符串,轉換后為“abc”。
表達式:StringUtils.substringBetween(value,"tag")
-
如果當前字段為字符串類型,刪除當前字符串兩端的控制字符(char≤32),例如刪除字符串前后的空格。
表達式:StringUtils.trim(value)
-
將當前字符串轉換為字節,如果轉換失敗,則返回0。
表達式:NumberUtils.toByte(value)
-
將當前字符串轉換為字節,如果轉換失敗,則返回指定值,例如指定值配置為1。
表達式:NumberUtils.toByte(value,1)
-
將當前字符串轉換為Double數值,如果轉換失敗,則返回0.0d。
表達式:NumberUtils.toDouble(value)
-
將當前字符串轉換為Double數值,如果轉換失敗,則返回指定值,例如指定值配置為1.1d。
表達式:NumberUtils.toDouble(value,1.1d)
-
將當前字符串轉換為Float數值,如果轉換失敗,則返回0.0f。
表達式:NumberUtils.toFloat(value)
-
將當前字符串轉換為Float數值,如果轉換失敗,則返回指定值,例如配置指定值為1.1f。
表達式:NumberUtils.toFloat(value,1.1f)
-
將當前字符串轉換為Int數值,如果轉換失敗,則返回0。
表達式:NumberUtils.toInt(value)
-
將當前字符串轉換為Int數值,如果轉換失敗,則返回指定值,例如配置指定值為1。
表達式:NumberUtils.toInt(value,1)
-
將字符串轉換為Long數值,如果轉換失敗,則返回0。
表達式:NumberUtils.toLong(value)
-
將當前字符串轉換為Long數值,如果轉換失敗,則返回指定值,例如配置指定值為1L。
表達式:NumberUtils.toLong(value,1L)
-
將字符串轉換為Short數值,如果轉換失敗,則返回0。
表達式:NumberUtils.toShort(value)
-
將當前字符串轉換為Short數值,如果轉換失敗,則返回指定值,例如配置指定值為1。
表達式:NumberUtils.toShort(value,1)
-
將當前IP字符串轉換為Long數值,例如將“10.78.124.0”轉換為LONG數值是“172915712”。
表達式:CommonUtils.ipToLong(value)
-
從網絡讀取一個IP與物理地址映射文件,并存放到Map集合,這里的URL是IP與地址映射文件存放地址,例如“//10.114.205.45:21203/sqoop/IpList.csv”。
表達式:HttpsUtils.downloadMap("url")
-
將IP與地址映射對象緩存起來并指定一個key值用于檢索,例如“ipList”。
表達式:CommonUtils.setCache("ipList",HttpsUtils.downloadMap("url"))
-
取出緩存的IP與地址映射對象。
表達式:CommonUtils.getCache("ipList")
-
判斷是否有IP與地址映射緩存。
表達式:CommonUtils.cacheExists("ipList")
-
根據指定的偏移類型(month/day/hour/minute/second)及偏移量(正數表示增加,負數表示減少),將指定格式的時間轉換為一個新時間,例如將“2019-05-21 12:00:00”增加8個小時。
表達式:DateUtils.getCurrentTimeByZone("yyyy-MM-dd HH:mm:ss",value, "hour", 8)