Hive中运行Java脚本进行查询数据的二次处理

网上有很多在hive中运行python脚本的示例,但是对于一个coder来说,不要让语言成为限制你的因此,个人因为所有python能做的事情java也一样可以做,因此就尝试在hive中运行java脚本。其实只要了解了其中原理,任何一门语言都可以作为hive的脚本语言,在hive中运行脚本其实就是将select查询出来的结果重定向到脚本中,然后在脚本中对输入数据进行处理即可。大体步骤如下:

 

1:数据表如下:

hive> select * from daxin.tab_user;
OK
daxin	18	male	beijing
mali	28	female	shandong
wangsan	34	male	beijing
lisi	45	male	liaoning
liwu	58	female	beijing
maoliu	43	male	anhui
zhouba	62	female	beijing
Time taken: 0.081 seconds, Fetched: 7 row(s)

2:脚本逻辑:对用户名与年龄两个列加上属性名字,脚本逻辑如下:

public class ConcatFields {

    public static void main(String[] args) {

        Scanner cin = new Scanner(System.in);
        while (cin.hasNext()) {
            String line = cin.nextLine();
            String[] nameAndAge = line.split("\\t");
            System.out.println("姓名:" + nameAndAge[0] + "   年龄:" + nameAndAge[1]);
        }

    }
}

3:使用hive命令上传java脚本,并运行查询脚本:

hive> add file /Users/liuguangxin/Desktop/ConcatFields.class ;
Added resources: [/Users/liuguangxin/Desktop/ConcatFields.class]
hive> SELECT TRANSFORM(name,age) USING 'java ConcatFields' as concatValue  FROM daxin.tab_user;

查询结果:

姓名:daxin   年龄:18
姓名:mali   年龄:28
姓名:wangsan   年龄:34
姓名:lisi   年龄:45
姓名:liwu   年龄:58
姓名:maoliu   年龄:43
姓名:zhouba   年龄:62

小提示:在使用脚本处理查询时候,最好指定别名,比如本查询指定别名为concatValue;如果不指定的话,输出的列数会跟transform中列数一致,但是实际脚本输出只有一列,这将会导致输出存在一列为null;

 

例如不指定别名查询语句如下:

SELECT TRANSFORM(name,age) USING 'java ConcatFields'   FROM daxin.tab_user;

查询结果为:

姓名:daxin   年龄:18	NULL
姓名:mali   年龄:28	NULL
姓名:wangsan   年龄:34	NULL
姓名:lisi   年龄:45	NULL
姓名:liwu   年龄:58	NULL
姓名:maoliu   年龄:43	NULL
姓名:zhouba   年龄:62	NULL

 

所有的技术没有好坏,只有适合自己的才是最好的。

你可能感兴趣的:(Hive)