前言
在学习udf的时候,程序员给人的感觉就是会更快的知道。答案是肯定的,因为传统的观点是udf驱动的效率,但是程序员的世界是反过来的——程序员驱动udf效率。
udf的几座大山学习udf函数几乎需要回答以下问题:
1.做这个操作我有什么功能?2.我如何使用这个功能?3.为什么我要自己写一个函数?4.4.hive还有哪些肮脏的操作?
源码引入你肯定需要源代码来写程序。hive是开源的,源代码可以随时查阅。很多人因为编不出来就放弃了。其实源码只能导入idea search,当然可以调试的更好。有了源代码,我们可以进行各种搜索。这是我们的学习宝库!
函数的入口Udf其实就是一堆类执行函数。通常,hive为这种灵活的可扩展性提供了一个注册系统。我们需要找到我们注册的类:
package org.apache.hadoop.hive.ql.exec; ......若干引入包/** * FunctionRegistry. */public final class FunctionRegistry { private static final Logger LOG = LoggerFactory.getLogger(FunctionRegistry.class); ......若干代码我们可以看到源代码是有规律的引入函数的。第一个参数是函数的名称,第二个参数是实现类。不仅如此,udf在注册的时候对代码做了很好的分类,比如和字符操作相关的会放在一起:
system.registerGenericUDF("concat", GenericUDFConcat.class);system.registerUDF("substr", UDFSubstr.class, false);......和时间处理相关的也会放在一起。
system.registerUDF("day", UDFDayOfMonth.class, false);system.registerUDF("dayofmonth", UDFDayOfMonth.class, false);......按照有规律的排列,我们很容易找到自己想要的函数。
函数的实现类在函数的头部有一个描述,将由一个耐心的程序员详细编写。注册该功能时,desc命令可以看到该部分。
hive> desc function concat;Begin to execute:desc function concat;OKconcat(str1, str2, ... strN) - returns the concatenation of str1, str2, ... strN or concat(bin1, bin2, ... binN) - returns the concatenation of bytes in binary data bin1, bin2, ... binNTime taken: 0.029 seconds, Fetched: 1 row(s)测试代码这种代码蜂巢会经历很多测试。测试代码中的一个关键点是,这个函数的用法将直接写在代码中。因为测试是sql,所以源代码放在。g文件,我们找到它(搜索它):
关于udf的第一手使用基本