hive:创建udf函数过滤emoji表情等特殊字符

实际工作环境中hive导出数据到Mysql,总是报错
ncorrect string value: ‘\xF0\x9F\x98\x97\xF0\x9F…’这是因为hive表字段中存在特殊字符,但是mysql不支持。

下面写udf函数过滤掉特殊字符:

package com.***;
import org.apache.commons.lang3.CharEncoding;
import org.apache.hadoop.hive.ql.exec.UDF;

public class StringFilterEmoji 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 StringFilterEmoji().evaluate("1、꧁꫞꯭西安分公司负责人,全面主持各项事务;");
        System.out.print(evaluate);
    }
}

打jar包,上传linux然后再上传到hdfs:

dfs -put /var/lib/hadoop-hdfs/sqoop_b/udf_jar/udf_stringfilter.jar  /user/hive/warehouse/ods.db/udf_jar/udf_stringfilter.jar;

hive中添加jar包(包路径指向本地):
add jar /var/lib/hadoop-hdfs/sqoop_b/udf_jar/udf_stringfilter.jar;

创建永久函数:

create function stringfilterEmoji as'com.hy.StringFilterEmoji' using jar 'hdfs:///user/hive/warehouse/ods.db/udf_jar/udf_stringfilter.jar';

或创建临时函数:

create temporary function stringfilterEmoji as 'com.hy.StringFilterEmoji';

 

参考:

https://blog.csdn.net/weixin_42656794/article/details/90700828

 

 

 

 

 

你可能感兴趣的:(hive)