UDF可以直接应用于select语句,对查询结果做格式化处理后输出内容 操作作用于单个数据行,且产生了一个数据行作为输出 实现UDF(User-Defined-Function) 需要继承org.apache.hadoop.hive.ql.UDF 需要实现evaluate函数(evaluate函数支持重载)
实现UDF查找hive表中array类型列的值中是否包含某一项 SELECT FIND_IN_ARRAY(column, ‘key’) FROM users;
hive array基本操作看这里建表+查询+修改
编写完成后,导出jar包
方法1 会话结束后,函数会自动销毁,所以每次打开新的会话,都要重新add jar并create temporary function
hive> add jar /root/find_in_array.jar; Added [/root/find_in_array.jar] to class path Added resources: [/root/find_in_array.jar] hive> create temporary function find_in_array as 'com.neu.hive.UDF.find_in_array'; OK Time taken: 0.448 seconds hive> select find_in_array('beijing',worklocations,name)from users; OK zhangsan NULL Time taken: 0.578 seconds, Fetched: 2 row(s) hive> select find_in_array('beijing',worklocations)from users; OK ["beijing","shanghai","tianjin","hangzhou"] NULL Time taken: 0.049 seconds, Fetched: 2 row(s)方法2 使用hive -i参数在进入hive时自动初始化,会话结束后,函数也会自动销毁
# cat hive_init add jar /root/find_in_array.jar; create temporary function topK as 'com.neu.hive.UDF.find_in_array'; # hive -i hive_init方法3 将UDF注册为内置函数,如果不是特别通用,固化下来的函数,不要使用这种方法
报以下错误,一定要有evaluate函数,且参数要匹配,要仔细检查! hive> select find(name,users.worklocations)from users; FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments ‘worklocations’: No matching method for class com.neu.hive.UDF.find_in_array with (string, array). Possible choices: