`

Hive UDF 调用读取 程序包外的文件

 
阅读更多

 

如何编写UDF我就不赘述了,网上资料大把。贴一个参考链接直接略过。

 
主要讨论两个点,是开发过程中遇到的难点。
1. UDF读取外部资源。
2. 外部资源存放位置。
 
为什么会遇到这两个问题?
 
开发UDF的目的就是为了扩展数据库一些没有的功能。常用功能例如count,sum这些,但是偶尔会遇到一些复杂的计算数据库没有直接实现的函数,解决方法一是直接读取数据然后用程序去二次处理但是时间比较慢,解决方法二就是根据需求开发对应的UDF,在查询语句中直接运算出结果。
 
我遇到这个问题是在过根据用户ip进行地域统计的时候。由于ip不能直接与ip库进行对应,所以需要将ip进行转换,可以选择直接转换成bigint然后与ip库中的起止ipnum进行比较得到省id。
 
这种方法的UDF开发比较简单,只需要读取String ip然后返回long int就可以了。剩下的交由数据库处理。但是实际使用中,这样的方式非常缓慢。主要原因是ip库与联合查询的日志从数量级上就差别很大,数据倾斜非常厉害,往往一天的数据可能跑两天都不能结束!!这样的效率,无论如何都是没法接受的。
 
转变
 
思考了一段时间后,决定重写UDF。先前的方法主要考虑不想重整ip库的格式,所以思路被限制。目前的第二种方法是将ip库重构之后使用的。
 
重构ip库+折半查找=新的UDF。
 
可是新的UDF面临另外一个问题就是,重构的ip库需要作为外部资源在UDF内部进行调用。这一点是之前没遇到过的。【吐槽】baidu之后发现貌似没有发现可行的方法,果然还是google好用。。【吐槽完】
 
首先外部资源要在运行之前添加,使用命令add jar [jar file]或者add file [file]在hive中进行临时注册。
 
UDF中内部调用的文件地址直接用本地文件地址表示。例如: String filepath = "/home/dev/test/test.txt";上传至hive之后,外部文件地址只需改成String filepath = "./test.txt";即可。

 

文献转自:http://blog.sina.com.cn/s/blog_b88e09dd01014grp.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics