hiveudf源码(hive源码分析)
本文目录一览:
hive中的递归用udf怎么实现
最近感受了hive的udf函数的强大威力了,不仅可以使用很多已经有的udf函数,还可以自己定义符合业务场景的udf函数,下面就说一下如何写udf/udaf/udtf函数,算是一个入门介绍吧。
First, you need to create a new class that extends UDF, with one or more methods named evaluate.
package com.example.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public final class Lower extends UDF {
public Text evaluate(final Text s) {
if (s == null) { return null; }
return new Text(s.toString().toLowerCase());
如何写hive的udf函数
Hive内部自定义函数UDFHIVEUDF整理(一)关系运算等值比较:=语法:A=B操作类型:所有基本类型描述:如果表达式A与表达式B相等,则为TRUE;否则为FALSE举例:hiveselect1fromdualwhere1=1;1不等值比较:语法:AB操作类型:所有基本类型描述:如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A与表达式B不相等,则为TRUE;否则为FALSE举例:hiveselect1fromdualwhere12;1小于比较:select1fromdualwhere1select1fromdualwhere1语法:AB操作类型:所有基本类型描述:如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A大于表达式B,则为TRUE;否则为FALSE举例:hiveselect1fromdualwhere21;1大于等于比较:=语法:A=B操作类型:所有基本类型描述:如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A大于或者等于表达式B,则为TRUE;否则为FALSE举例:hiveselect1fromdualwhere1=1;1String的比较要注意(常用的时间比较可以先to_date之后再比较)hiveselect*fromudftest;OK201111120900:00:002011111209hiveselecta,b,ab,a=bfromudftest;201111120900:00:002011111209falsetruefalse空值判断:ISNULL语法:AISNULL操作类型:所有类型描述:如果表达式A的值为NULL,则为TRUE;否则为FALSE举例:hiveselect1fromdualwherenullisnull;1非空判断:ISNOTNULL语法:AISNOTNULL操作类型:所有类型描述:如果表达式A的值为NULL,则为FALSE;否则为TRUE举例:hiveselect1fromdualwhere1isnotnull;1LIKE比较:LIKE语法:ALIKEB操作类型:strings描述:如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合表达式B的正则语法,则为TRUE;否则为FALSE。B中字符”_”表示任意单个字符,而字符”%”表示任意数量的字符。举例:hiveselect1fromdualwhere‘football’like‘foot%’;1hiveselect1fromdualwhere‘football’like‘foot____’;1JAVA的LIKE操作:RLIKE语法:ARLIKEB操作类型:strings描述:如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合JAVA正则表达式B的正则语法,则为TRUE;否则为FALSE。举例:hiveselect1fromdualwhere‘footbar’rlike‘^f.*r$’;1REGEXP操作:REGEXP语法:AREGEXPB操作类型:strings描述:功能与RLIKE相同举例:hiveselect1fromdualwhere‘footbar’REGEXP‘^f.*r$’;1HIVEUDF整理(二)hive添加评论十二192011数学运算加法操作:+语法:A+B操作类型:所有数值类型说明:返回A与B相加的结果。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。比如,int+int一般结果为int类型,而int+double一般结果为double类型举例:hiveselect1+9fromdual;10hivecreatetableudftestasselect1+1.2fromdual;hivedescribeudftest;_c0double减法操作:-语法:A–B操作类型:所有数值类型说明:返回A与B相减的结果。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。比如,int–int一般结果为int类型,而int–double一般结果为double类型举例:hiveselect10–5fromdual;5hivecreatetableudftestasselect5.6–4fromdual;hivedescribeudftest;_c0double乘法操作:*语法:A*B操作类型:所有数值类型说明:返回A与B相乘的结果。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。注意,如果A乘以B的结果超过默认结果类型的数值范围,则需要通过cast将结果转换成范围更大的数值类型举例:hiveselect40*5fromdual;200除法操作:/语法:A/B操作类型:所有数值类型说明:返回A除以B的结果。结果的数值类型为double举例:hiveselect40/5fromdual;8.0取余操作:%语法:A%B操作类型:所有数值类型说明:返回A除以B的余数。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。举例:hiveselect41%5fromdual;1hiveselect8.4%4fromdual;0.40000000000000036注:精度在hive中是个很大的问题,类似这样的操作最好通过round指定精度hiveselectround(8.4%4,2)fromdual;0.4位与操作:语法:AB操作类型:所有数值类型说明:返回A和B按位进行与操作的结果。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。举例:hiveselect48fromdual;0hiveselect64fromdual;4位或操作:|语法:A|B操作类型:所有数值类型说明:返回A和B按位进行或操作的结果。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。举例:hiveselect4|8fromdual;12hiveselect6|8fromdual;14位异或操作:^语法:A^B操作类型:所有数值类型说明:返回A和B按位进行异或操作的结果。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。举例:hiveselect4^8fromdual;12hiveselect6^4fromdual;2位取反操作:~语法:~A操作类型:所有数值类型说明:返回A按位取反操作的结果。结果的数值类型等于A的类型。举例:hiveselect~6fromdual;-7hiveselect~4fromdual;-5逻辑运算逻辑与操作:AND语法:AANDB操作类型:boolean说明:如果A和B均为TRUE,则为TRUE;否则为FALSE。如果A为NULL或B为NULL,则为NULL举例:hiveselect1fromdualwhere1=1and2=2;1逻辑或操作:OR语法:AORB操作类型:boolean说明:如果A为TRUE,或者B为TRUE,或者A和B均为TRUE,则为TRUE;否则为FALSE举例:hiveselect1fromdualwhere1=2or2=2;1逻辑非操作:NOT语法:NOTA操作类型:boolean说明:如果A为FALSE,或者A为NULL,则为TRUE;否则为FALSE举例:hiveselect1fromdualwherenot1=2;1HIVEUDF整理(四)hive添加评论十二192011复合类型构建操作Map类型构建:map语法:map(key1,value1,key2,value2,…)说明:根据输入的key和value对构建map类型举例:hiveCreatetableudftestasselectmap(’100′,’tom’,’200′,’mary’)astfromdual;hivedescribeudftest;tmaphiveselecttfromudftest;{“100″:”tom”,”200″:”mary”}Struct类型构建:struct语法:struct(val1,val2,val3,…)说明:根据输入的参数构建结构体struct类型举例:hivecreatetableudftestasselectstruct(‘tom’,'mary’,'tim’)astfromdual;hivedescribeudftest;tstructhiveselecttfromudftest;{“col1″:”tom”,”col2″:”mary”,”col3″:”tim”}array类型构建:array语法:array(val1,val2,…)说明:根据输入的参数构建数组array类型举例:hivecreatetableudftestasselectarray(“tom”,”mary”,”tim”)astfromdual;hivedescribeudftest;tarrayhiveselecttfromudftest;["tom","mary","tim"]HIVEUDF整理(五)hive添加评论十二192011复杂类型访问操作array类型访问:A[n]语法:A[n]操作类型:A为array类型,n为int类型说明:返回数组A中的第n个变量值。数组的起始下标为0。比如,A是个值为['foo','bar']的数组类型,那么A[0]将返回’foo’,而A[1]将返回’bar’举例:hivecreatetableudftestasselectarray(“tom”,”mary”,”tim”)astfromdual;hiveselectt[0],t[1],t[2]fromudftest;tommarytimmap类型访问:M[key]语法:M[key]操作类型:M为map类型,key为map中的key值说明:返回map类型M中,key值为指定值的value值。比如,M是值为{‘f’-‘foo’,‘b’-‘bar’,‘all’-‘foobar’}的map类型,那么M[‘all’]将会返回’foobar’举例:hiveCreatetableudftestasselectmap(’100′,’tom’,’200′,’mary’)astfromdual;hiveselectt['200'],t['100']fromudftest;marytomstruct类型访问:S.x语法:S.x操作类型:S为struct类型说明:返回结构体S中的x字段。比如,对于结构体structfoobar{intfoo,intbar},foobar.foo返回结构体中的foo字段举例:hivecreatetableudftestasselectstruct(‘tom’,'mary’,'tim’)astfromdual;hivedescribeudftest;tstructhiveselectt.col1,t.col3fromudftest;tomtimHIVEUDF整理(六)hive添加评论十二192011
org.apahce.hadoop.hive.ql.exec.udf 在哪个包里
你说的应该是hive的udf吧?
udf的源码如下:
package org.apache.hadoop.hive.ql.exec;
import org.apache.hadoop.hive.ql.udf.UDFType;
@UDFType(
deterministic = true
)
public class UDF {
private UDFMethodResolver rslv;
// 后面省略
可以看到,类UDF在包org.apache.hadoop.hive.ql.exec下,如果要使用hive的udf,需要用到以下依赖:
我用的是maven pom, pom依赖如下:
dependency
groupIdorg.apache.hive/groupId
artifactIdhive-exec/artifactId
version2.1.0/version
/dependency