使用Hive处理数据的时候,写了一个UDF,而后上传到服务器,添加到Hive中以后,一直报以下的错误:java
FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments '"[12.34, 18.34]"': No matching method for class cn.com.xh.udf.Distance with (string, string). Possible choices:
语义错误,错误码10014,我只在网上看到一个这个问题的提问,没有人回答,并且他的错误一眼就看出来了, UDF没有使用规定的方法名称,看到这里,我马上检查个人方法名称,代码片断以下:apache
import org.apache.hadoop.hive.ql.exec.UDF; public class Distance extends UDF { /** * 两个经纬度点之间的距离计算。 * @param coord1 一个点的经纬度形如:[a,b] * @param coord2 另外一个点的经纬度,形如:[a,b] * @return value 距离,若是返回-1表示参数没法计算或者缺失 */ public double envalate(String coord1, String coord2) { // coord1:Document{{type=Point, coordinates=[116.423291, 39.98778]}} // coord2:[116.44308142812918, 39.98923993314435] if (coord1 == null && coord2 == null) { return -1;// -1表示没法计算,缺失值等不正常状况。 } int c1 = coord1.indexOf("[") + 1; // System.out.println(c1); int c2 = coord1.indexOf("]"); //省略后续代码 } }
一开始本人看了方法名称,感受没错,但是后来,认真的对比了以后,发现方法名称写错了,正确的方法名称:evaluate()编程
这个坑能够吧!踩得够深!bash
将方法名称修改完成,而后删除Hive中已经注册的方法,退出Hive Shell界面,从新进入Hive Shell,再进行UDF注册的步骤。便可解决!有时候不退出的话,会一直报错,不会进行jar包更新。服务器
UDF注册参见:HIVE的UDF以及JDBC编程oop
自古写代码字母写错了是最难检查的问题,因此写的时候必定要认真!这是一个很怎么说呢?很“高级”的错误!lua