MaxCompute UDF係列之全角轉半角
我們在做文本挖掘處理的時候,需要經常把全角字符轉成半角處理,今天為大家提供一個全角轉半角的UDF,下載地址見附件。
效果如下:
MaxCompute UDF代碼如下:
package com.yinlin.udf.dev;
import com.aliyun.odps.udf.UDF;
//import org.apache.commons.lang.StringUtils;
/**
* 提供對字符串的全角->半角,半角->全角轉換
*/
public class BCConvert extends UDF {
/**
* ASCII表中可見字符從!開始,偏移位值為33(Decimal)
*/
static final char DBC_CHAR_START = 33; // 半角!
/**
* ASCII表中可見字符到~結束,偏移位值為126(Decimal)
*/
static final char DBC_CHAR_END = 126; // 半角~
/**
* 全角對應於ASCII表的可見字符從!開始,偏移值為65281
*/
static final char SBC_CHAR_START = 65281; // 全角!
/**
* 全角對應於ASCII表的可見字符到~結束,偏移值為65374
*/
static final char SBC_CHAR_END = 65374; // 全角~
/**
* ASCII表中除空格外的可見字符與對應的全角字符的相對偏移
*/
static final int CONVERT_STEP = 65248; // 全角半角轉換間隔
/**
* 全角空格的值,它沒有遵從與ASCII的相對偏移,必須單獨處理
*/
static final char SBC_SPACE = 12288; // 全角空格 12288
/**
* 半角空格的值,在ASCII中為32(Decimal)
*/
static final char DBC_SPACE = ' '; // 半角空格
/**
* 全角字符->半角字符轉換
* 隻處理全角的空格,全角!到全角~之間的字符,忽略其他
*/
public String evaluate(String src) {
if (src == null) {return src;}
StringBuilder buf = new StringBuilder(src.length());
char[] ca = src.toCharArray();
for (int i = 0; i < src.length(); i++) {
if (ca[i] >= SBC_CHAR_START && ca[i] <= SBC_CHAR_END)
{// 如果位於全角!到全角~區間內
buf.append((char) (ca[i] - CONVERT_STEP));
}
else if (ca[i] == SBC_SPACE)
{// 如果是全角空格
buf.append(DBC_SPACE);
}
else { // 不處理全角空格,全角!到全角~區間外的字符
buf.append(ca[i]);
}
}
return buf.toString();
}
}
使用方法:
1、通過Eclipse將BCConver.java編譯成Jar包,命名為BCConver.jar。
2、通過大數據開發套件,上傳資源BCConver.jar;
3、通過大數據開發套件,引用第二步上傳的BCConver.jar資源,注冊bcconver函數;
4、通過大數據開發套件新建SQL腳本,輸入SQL函數進行測試。
--創建虛擬表
CREATE TABLE IF NOT EXISTS dual (id STRING);
insert into table dual select '1' from (select count(1) from dual) t;
--提供對字符串的全角->半角
select bcconvert('nihaohk | nihehe ,。 78 7 ') from yinlin_demo.dual limit 1;
到此為止,實驗完成。
常見問題
Q:無結果?
我們在創建虛擬dual表的時候,一定要保證表中有數據。
Q:無法找到函數?
利用大數據開發套件注冊函數的時候需要包名+類名,否則會找不到類。
阿裏巴巴大數據-玩家社區 https://yq.aliyun.com/teams/6/
---阿裏大數據博文,問答,社群,實踐,有朋自遠方來,不亦說乎……
最後更新:2017-08-13 22:21:47