impala 自定义函数实现全半角转换及特殊字符过滤
程序员文章站
2022-07-11 15:34:11
...
需求:实现与oracle 过滤方法相同的功能
oracle 过滤方法:
FUNCTION F_CHANGE_CHR(V_NAME VARCHAR2) RETURN VARCHAR2 IS
RESULT VARCHAR2(200);
BEGIN
RESULT := REGEXP_REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(TO_SINGLE_BYTE(V_NAME),
'(',
''),
')',
''),
'(',
''),
')',
''),
CHR(9),
''),
CHR(13),
''),
'?',
''),
'?',
''),
'《',
''),
'》',
''),
'【',
''),
'】',
''),
'—',
''),
'·',
''),
' ',
''),
'.',
''),
',',
''),
'<<',
''),
'>>',
''),'[[:punct:]]');
RETURN RESULT;
END;
问题难点:
在oracle 中,正则 [[:punct:]] 是过滤所有 特殊字符,但是在java 里面 \\p{Punct} 并不能达到相同效果,
impala 自定义函数最终实现:
// 实现全角转半角
// 写法说明: 由于impala 版本较低的原因,在evaluate 的参数 变为string,返回的结果不采用Text 进行转 //换的话,在impala 的查询结果为乱码,原因位置。但是后来我在impala 2.12 版本中并不会
public static Text evaluate(Text s) throws UnsupportedEncodingException {
if (s == null) {
return s;
} else {
Text result = new Text();
byte[] bs = s.getBytes();
String str = new String(bs, "UTF-8");
if (str.length() <= 0) {
return s;
} else {
char[] charArray = str.toCharArray();
//对全角字符转换的char数组遍历
for (int i = 0; i < charArray.length; ++i) {
int charIntValue = (int) charArray[i];
//如果符合转换关系,将对应下标之间减掉偏移量65248;如果是空格的话,直接做转换
if (charIntValue >= 65281 && charIntValue <= 65374) {
charArray[i] = (char) (charIntValue - 65248);
} else if (charIntValue == 12288) {
charArray[i] = (char) 32;
}
}
result.set(new Text(new String(charArray)));
}
Text newchar=change_char(result);
return newchar;
}
}
// 字符过滤
public static Text change_char(Text regexstr){
Text returnstr=new Text();
String targetstr=regexstr.toString();
String target1= targetstr.
replaceAll("[[\\pP|\\pS]&&[^―]]","").
replaceAll("\\s*|\r|\t|\n","");
returnstr.set(new Text(target1));
return returnstr;
}
上一篇: Python统计学基础(一)
下一篇: 自定义函数