相关文章推荐
想旅行的钥匙  ·  从“乔的笑”说起_中华人民共和国外交部·  5 月前    · 
傻傻的豆浆  ·  【火焰纹章IF】永夜1.0版本发布!(基于暗 ...·  7 月前    · 
跑龙套的葡萄酒  ·  【寻脉江苏】南京云锦博物馆馆长:我是台北人, ...·  7 月前    · 
酷酷的酱牛肉  ·  Surface Mobile ...·  7 月前    · 
痴情的人字拖  ·  便當- 維基詞典,自由的多語言詞典·  8 月前    · 
小百科  ›  0650-6.2.0-通过UDF实现Hive&Impala的中文拼音排序开发者社区
hive
慈祥的砖头
2 年前
作者头像
Fayson
0 篇文章

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

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > Hadoop实操 > 0650-6.2.0-通过UDF实现Hive&Impala的中文拼音排序

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

作者头像
Fayson
发布 于 2019-06-17 18:35:30
1.4K 0
发布 于 2019-06-17 18:35:30
举报

作者:余枫

1

问题重现

  • 测试环境:

1.RedHat7.2

2.CDH6.2.0

3.使用root进行操作

1.在Hive中创建一个表,并导入数据如下

2.对s2字段进行排序

select * from hanzi order by s2; 

在Hive中:

在Impala中:

由上面两张图可以看出,在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包

<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>cn.com.gzcb.hive.udf.HanyuPinyinHelper</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-exec</artifactId>
        <version>2.1.1-cdh6.2.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.belerweb/pinyin4j -->
 
推荐文章
想旅行的钥匙  ·  从“乔的笑”说起_中华人民共和国外交部
5 月前
傻傻的豆浆  ·  【火焰纹章IF】永夜1.0版本发布!(基于暗夜的改版)_哔哩哔哩bilibili
7 月前
跑龙套的葡萄酒  ·  【寻脉江苏】南京云锦博物馆馆长:我是台北人,也是新南京人_南京 ...
7 月前
酷酷的酱牛肉  ·  Surface Mobile Mouse配对后无法使用- Microsoft Q&amp;A
7 月前
痴情的人字拖  ·  便當- 維基詞典,自由的多語言詞典
8 月前
Link管理   ·   Sov5搜索   ·   小百科
小百科 - 百科知识指南