欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
    }

 

相关标签: hive java impala