0650-6.2.0-通过UDF实现Hive&Impala的中文拼音排序

Fayson的github: https://github.com/fayson/cdhproject

推荐关注微信公众号:“Hadoop实操”,ID:gh_c4c535955d0f

1 问题重现

测试环境:

1.RedHat7.2

2.CDH6.2.0

3.使用root进行操作

1.在Hive中创建一个表,并导入数据如下
0650-6.2.0-通过UDF实现Hive&Impala的中文拼音排序_第1张图片
2.对s2字段进行排序

select * from hanzi order by s2; 

在Hive中:
0650-6.2.0-通过UDF实现Hive&Impala的中文拼音排序_第2张图片
在Impala中:

0650-6.2.0-通过UDF实现Hive&Impala的中文拼音排序_第3张图片
由上面两张图可以看出,在Hive和Impala中排序都失败了,没有按照期望中的中文对应的拼音进行排序。

2 问题解决

1.想要实现对中文字段的排序,需要将中文字段转换成拼音,然后在Hive、Impala中对拼音进行排序即可。因此可以使用UDF在Java中写一个汉字转拼音的程序,然后在Hive、Impala中使用,代码如下:

public String evaluate(String ChineseLanguage) {
    char[] cl_chars = ChineseLanguage.trim().toCharArray();
    String hanyupinyin = "";
    HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
    defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);// 输出拼音全部小写
    defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);// 不带声调
    defaultFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
    try {
        for (int i = 0; i < cl_chars.length; i++) {
            if (String.valueOf(cl_chars[i]).matches("[\u4e00-\u9fa5]+")) {// 如果字符是中文,则将中文转为汉语拼音
                hanyupinyin += PinyinHelper.toHanyuPinyinStringArray(cl_chars[i], defaultFormat)[0];
            } else {// 如果字符不是中文,则不转换
                hanyupinyin += cl_chars[i];
            }
        }
    } catch (BadHanyuPinyinOutputFormatCombination e) {
        System.out.println("字符不能转成汉语拼音");
    }
    return hanyupinyin;
}

2.将编写好的代码打成jar包并上传到服务器

打包前在POM文件中加入配置,将所有依赖也一起打成一个jar包


    
        
            maven-assembly-plugin
            
                
                    
                        cn.com.gzcb.hive.udf.HanyuPinyinHelper
                    
                
                
                    jar-with-dependencies
                
            
        
    



        org.apache.hive
        hive-exec
        2.1.1-cdh6.2.0
    
    
    
        com.belerweb
        pinyin4j
        2.5.0
    

0650-6.2.0-通过UDF实现Hive&Impala的中文拼音排序_第4张图片

使用mvn assembly:assembly命令打包,打好的包如下,以-jar-with-dependencies结尾
在这里插入图片描述

上传到服务器

在这里插入图片描述

3.将jar包上传到HDFS,创建UDF函数

上传到/user/hive/udfjar目录下

在这里插入图片描述

进入Hive中,创建UDF函数

create function default.parse_chinese as 'cn.com.gzcb.hive.udf.HanyuPinyinHelper' using jar 'hdfs://cdh177.macro.com:8020/user/hive/udfjar/hive-udf-0.0.1-SNAPSHOT-jar-with-dependencies.jar';

0650-6.2.0-通过UDF实现Hive&Impala的中文拼音排序_第5张图片
4.再次对hanzi表进行排序

select s2,parse_chinese(s2) as s3 from hanzi order by s3;

Hive
0650-6.2.0-通过UDF实现Hive&Impala的中文拼音排序_第6张图片

0650-6.2.0-通过UDF实现Hive&Impala的中文拼音排序_第7张图片

Impala

0650-6.2.0-通过UDF实现Hive&Impala的中文拼音排序_第8张图片
从Hive和Impala的执行结果可以看出,是按照拼音的升序成功进行了排序。

3 问题总结

无论是Hive还是Impala都不支持中文按照拼音的排序,因为它们支持的主要是标准的ASCII字符集并不包含中文,如果要对中文按照拼音排序,需要通过UDF将中文转换成拼音后实现,而中文转换成拼音的函数Java中有很多现成的参考比较方便。

你可能感兴趣的:(Hadoop实操)