You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by kg...@apache.org on 2019/03/08 09:05:39 UTC
[hive] 02/02: HIVE-19968: UDF exception is not throw out (Laszlo
Bodor via Zoltan Haindrich)
This is an automated email from the ASF dual-hosted git repository.
kgyrtkirk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git
commit d42809ea49b4afe34a8f648f6e406c46b9d412d6
Author: Laszlo Bodor <bo...@gmail.com>
AuthorDate: Fri Mar 8 09:40:45 2019 +0100
HIVE-19968: UDF exception is not throw out (Laszlo Bodor via Zoltan Haindrich)
Signed-off-by: Zoltan Haindrich <ki...@rxd.hu>
---
.../hive/ql/udf/generic/GenericUDFReflect.java | 13 +++++++++++--
ql/src/test/queries/clientpositive/udf_reflect.q | 6 ++++--
ql/src/test/results/clientpositive/udf_reflect.q.out | 20 ++++++++++++--------
3 files changed, 27 insertions(+), 12 deletions(-)
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFReflect.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFReflect.java
index 9e364af..471a6a1 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFReflect.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFReflect.java
@@ -22,6 +22,7 @@ import java.util.Arrays;
import org.apache.hadoop.hive.common.JavaUtils;
import org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.hadoop.hive.ql.exec.FunctionRegistry;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
@@ -33,6 +34,8 @@ import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.Pr
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector;
import org.apache.hadoop.util.ReflectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* A simple generic udf to call java static functions via reflection.
@@ -42,6 +45,7 @@ import org.apache.hadoop.util.ReflectionUtils;
extended = "Use this UDF to call Java methods by matching the argument signature\n")
@UDFType(deterministic = false)
public class GenericUDFReflect extends AbstractGenericUDFReflect {
+ private static final Logger LOG = LoggerFactory.getLogger(GenericUDFReflect.class);
private transient StringObjectInspector inputClassNameOI;
private transient StringObjectInspector inputMethodNameOI;
@@ -105,13 +109,18 @@ public class GenericUDFReflect extends AbstractGenericUDFReflect {
try {
c = JavaUtils.loadClass(classNameString);
} catch (ClassNotFoundException ex) {
- throw new HiveException("UDFReflect evaluate ", ex);
+ throw new HiveException(String.format("UDFReflect evaluate error while loading class %s", classNameString), ex);
}
try {
o = null;
o = ReflectionUtils.newInstance(c, null);
} catch (Exception e) {
- // ignored
+ if (e.getCause() instanceof NoSuchMethodException){
+ // still could be okay while using a static method of a class that hasn't got a default/parameterless constructor
+ LOG.trace("ignoring NoSuchMethodException while instantiating class", e);
+ }else{
+ throw new HiveException(String.format("UDFReflect evaluate error while instantiating class %s", classNameString), e);
+ }
}
classNameChanged = true;
}
diff --git a/ql/src/test/queries/clientpositive/udf_reflect.q b/ql/src/test/queries/clientpositive/udf_reflect.q
index c7cdd7f..90ef5bb 100644
--- a/ql/src/test/queries/clientpositive/udf_reflect.q
+++ b/ql/src/test/queries/clientpositive/udf_reflect.q
@@ -12,7 +12,8 @@ SELECT reflect("java.lang.String", "valueOf", 1),
reflect("java.lang.Math", "round", 2.5D),
round(reflect("java.lang.Math", "exp", 1.0D), 6),
reflect("java.lang.Math", "floor", 1.9D),
- reflect("java.lang.Integer", "valueOf", key, 16)
+ reflect("java.lang.Integer", "valueOf", key, 16),
+ reflect("java.lang.Integer", "valueOf", "16")
FROM src tablesample (1 rows);
@@ -23,5 +24,6 @@ SELECT reflect("java.lang.String", "valueOf", 1),
reflect("java.lang.Math", "round", 2.5D),
round(reflect("java.lang.Math", "exp", 1.0D), 6),
reflect("java.lang.Math", "floor", 1.9D),
- reflect("java.lang.Integer", "valueOf", key, 16)
+ reflect("java.lang.Integer", "valueOf", key, 16),
+ reflect("java.lang.Integer", "valueOf", "16")
FROM src tablesample (1 rows);
diff --git a/ql/src/test/results/clientpositive/udf_reflect.q.out b/ql/src/test/results/clientpositive/udf_reflect.q.out
index 40e1d84..57b3b30 100644
--- a/ql/src/test/results/clientpositive/udf_reflect.q.out
+++ b/ql/src/test/results/clientpositive/udf_reflect.q.out
@@ -21,7 +21,8 @@ SELECT reflect("java.lang.String", "valueOf", 1),
reflect("java.lang.Math", "round", 2.5D),
round(reflect("java.lang.Math", "exp", 1.0D), 6),
reflect("java.lang.Math", "floor", 1.9D),
- reflect("java.lang.Integer", "valueOf", key, 16)
+ reflect("java.lang.Integer", "valueOf", key, 16),
+ reflect("java.lang.Integer", "valueOf", "16")
FROM src tablesample (1 rows)
PREHOOK: type: QUERY
PREHOOK: Input: default@src
@@ -34,7 +35,8 @@ SELECT reflect("java.lang.String", "valueOf", 1),
reflect("java.lang.Math", "round", 2.5D),
round(reflect("java.lang.Math", "exp", 1.0D), 6),
reflect("java.lang.Math", "floor", 1.9D),
- reflect("java.lang.Integer", "valueOf", key, 16)
+ reflect("java.lang.Integer", "valueOf", key, 16),
+ reflect("java.lang.Integer", "valueOf", "16")
FROM src tablesample (1 rows)
POSTHOOK: type: QUERY
POSTHOOK: Input: default@src
@@ -53,9 +55,9 @@ STAGE PLANS:
Statistics: Num rows: 500 Data size: 43500 Basic stats: COMPLETE Column stats: COMPLETE
GatherStats: false
Select Operator
- expressions: reflect('java.lang.String','valueOf',1) (type: string), reflect('java.lang.String','isEmpty') (type: string), reflect('java.lang.Math','max',2,3) (type: string), reflect('java.lang.Math','min',2,3) (type: string), reflect('java.lang.Math','round',2.5D) (type: string), round(reflect('java.lang.Math','exp',1.0D), 6) (type: double), reflect('java.lang.Math','floor',1.9D) (type: string), reflect('java.lang.Integer','valueOf',key,16) (type: string)
- outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7
- Statistics: Num rows: 500 Data size: 648000 Basic stats: COMPLETE Column stats: COMPLETE
+ expressions: reflect('java.lang.String','valueOf',1) (type: string), reflect('java.lang.String','isEmpty') (type: string), reflect('java.lang.Math','max',2,3) (type: string), reflect('java.lang.Math','min',2,3) (type: string), reflect('java.lang.Math','round',2.5D) (type: string), round(reflect('java.lang.Math','exp',1.0D), 6) (type: double), reflect('java.lang.Math','floor',1.9D) (type: string), reflect('java.lang.Integer','valueOf',key,16) (type: string), reflect('java.lang [...]
+ outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8
+ Statistics: Num rows: 500 Data size: 740000 Basic stats: COMPLETE Column stats: COMPLETE
ListSink
PREHOOK: query: SELECT reflect("java.lang.String", "valueOf", 1),
@@ -65,7 +67,8 @@ PREHOOK: query: SELECT reflect("java.lang.String", "valueOf", 1),
reflect("java.lang.Math", "round", 2.5D),
round(reflect("java.lang.Math", "exp", 1.0D), 6),
reflect("java.lang.Math", "floor", 1.9D),
- reflect("java.lang.Integer", "valueOf", key, 16)
+ reflect("java.lang.Integer", "valueOf", key, 16),
+ reflect("java.lang.Integer", "valueOf", "16")
FROM src tablesample (1 rows)
PREHOOK: type: QUERY
PREHOOK: Input: default@src
@@ -77,9 +80,10 @@ POSTHOOK: query: SELECT reflect("java.lang.String", "valueOf", 1),
reflect("java.lang.Math", "round", 2.5D),
round(reflect("java.lang.Math", "exp", 1.0D), 6),
reflect("java.lang.Math", "floor", 1.9D),
- reflect("java.lang.Integer", "valueOf", key, 16)
+ reflect("java.lang.Integer", "valueOf", key, 16),
+ reflect("java.lang.Integer", "valueOf", "16")
FROM src tablesample (1 rows)
POSTHOOK: type: QUERY
POSTHOOK: Input: default@src
#### A masked pattern was here ####
-1 true 3 2 3 2.718282 1.0 568
+1 true 3 2 3 2.718282 1.0 568 16