hive的udf,过滤表情等非法字符

实际工作环境中hive导出数据到Mysql,总是报错
ncorrect string value: ‘\xF0\x9F\x98\x97\xF0\x9F…’
这是由于手机表情不支持UTF-8的
运营那边需要nickname,所以就将昵称中的表情过滤掉

1.写过滤表情逻辑

/**
 * Created by Liutao on 2019/5/22 16:31
 */
public class FilterEmo extends UDF {
    public String evaluate(String str) {
        StringBuffer out = new StringBuffer();
        if (str == null || ("".equals(str)))
            return "";
        char[] chars = str.toCharArray();
        for(int i = 0; i < chars.length; i ++) {
            if((chars[i] >= 19968 && chars[i] <= 40869) //中日朝兼容形式的unicode编码范围: U+4E00——U+9FA5
                    || (chars[i] >= 11904 && chars[i] <= 42191)//中日朝兼容形式扩展
                    || (chars[i] >= 63744 && chars[i] <= 64255)//中日朝兼容形式扩展
                    || (chars[i] >= 65072 && chars[i] <= 65103)//中日朝兼容形式扩展
                    || (chars[i] >= 65280 && chars[i] <= 65519)//全角ASCII、全角中英文标点、半宽片假名、半宽平假名、半宽韩文字母的unicode编码范围:U+FF00——U+FFEF
                    || (chars[i] >= 32 && chars[i] <= 126)//半角字符的unicode编码范围:U+0020-U+007e
                    || (chars[i] >= 12289 && chars[i] <= 12319)//全角字符的unicode编码范围:U+3000——U+301F
                    ) {
                out.append(chars[i]);
            }
        }
        String result=out.toString().trim();
        result=result.replaceAll("\\?", "").replaceAll("\\*", "").replaceAll("<|>", "").replaceAll("\\|", "").replaceAll("/", "");
        return result;
    }
    
    public static void main(String[] args) {
        String evaluate = new FilterEmo().evaluate(args[0]);
    }
}

2打包到linux环境上
3在hive命令中,输入

add jar /root/Filter1.jar;
create temporary function remo as 'UDF.FilterEmo';
查询
select id,remo(nickname) name from ods_userinfo where dt='';

但是注意一点,这个注册的函数并不是一直都存在的,每次hive关闭再启动就消失了,所以最好是通过shell脚本或者hive -e ,hive -f在里面每次需要调用的时候再操作一边

hive -e "
add jar /root/Filter1.jar;
create temporary function remo as 'UDF.FilterEmo';
select id,remo(nickname) name from ods_userinfo where dt='';
"

版权声明:本文为weixin_42656794原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。