如何编写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
相关推荐
因为项目需要使用到python udf 工hql调用 ...2.UDF中内部调用的文件地址直接用本地文件地址表示。例如: String filepath = “/home/dev/test/test.txt”;上传至hive之后,外部文件地址只需改成String fil
当开发者尝试在 Spark 应用程序中调用 Hive 的 UDF 时,可能会遇到如下错误或异常行为: - Spark 应用程序未能识别 Hive UDF。 - 执行包含 Hive UDF 的 Spark SQL 查询时出现运行时错误。 - Spark 的 DataFrame API ...
- 示例题目:编写一个Spark程序,统计一组文本文件中每个单词出现的次数。 **19. reduceByKey与groupByKey的性能对比** - `reduceByKey`性能更好,因为它在Shuffle前执行局部聚合。 - `groupByKey`可能导致大量...
读取先前存在的Hive表并填充上一步创建的表的Pig作业 在Pig作业的输出表上发出Impala刷新/无效元数据语句的Java操作 然后,通过JDBI框架将有关受监视的Oozie作业和操作的信息存储在PostgreSQL数据库中 辅助模块cdh...
- **Hive**:基于Hadoop的数据仓库工具,用于数据ETL(提取、转换、加载)和查询,Java可以用来编写Hive的UDF(用户自定义函数)。 3. **Java与大数据接口**: - **Java API for Hadoop**:Apache Hadoop提供了...