This is an automated email from the ASF dual-hosted git repository.

jark pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git


The following commit(s) were added to refs/heads/master by this push:
     new f9bd7d2f553 [FLINK-28296][hive] Support the Hive UDAF which implement 
GenericUDAFResolver interface (#20102)
f9bd7d2f553 is described below

commit f9bd7d2f553174c2ae25da63e3d5be156649cf27
Author: yuxia Luo <[email protected]>
AuthorDate: Fri Aug 5 21:16:51 2022 +0800

    [FLINK-28296][hive] Support the Hive UDAF which implement 
GenericUDAFResolver interface (#20102)
---
 .../factories/HiveFunctionDefinitionFactory.java   | 14 ++++++-
 .../table/functions/hive/HiveGenericUDAF.java      | 33 ++++++++--------
 .../table/functions/hive/HiveGenericUDAFTest.java  | 45 +++++++++++++++++++---
 3 files changed, 69 insertions(+), 23 deletions(-)

diff --git 
a/flink-connectors/flink-connector-hive/src/main/java/org/apache/flink/table/catalog/hive/factories/HiveFunctionDefinitionFactory.java
 
b/flink-connectors/flink-connector-hive/src/main/java/org/apache/flink/table/catalog/hive/factories/HiveFunctionDefinitionFactory.java
index d3cb9f39763..7c193573d80 100644
--- 
a/flink-connectors/flink-connector-hive/src/main/java/org/apache/flink/table/catalog/hive/factories/HiveFunctionDefinitionFactory.java
+++ 
b/flink-connectors/flink-connector-hive/src/main/java/org/apache/flink/table/catalog/hive/factories/HiveFunctionDefinitionFactory.java
@@ -35,6 +35,7 @@ import org.apache.flink.table.functions.hive.HiveSimpleUDF;
 
 import org.apache.hadoop.hive.ql.exec.UDAF;
 import org.apache.hadoop.hive.ql.exec.UDF;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFResolver;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFResolver2;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
@@ -120,19 +121,28 @@ public class HiveFunctionDefinitionFactory implements 
FunctionDefinitionFactory
             LOG.info("Transforming Hive function '{}' into a HiveGenericUDTF", 
name);
             return new HiveGenericUDTF(new HiveFunctionWrapper<>(functionClz), 
hiveShim);
         } else if (GenericUDAFResolver2.class.isAssignableFrom(functionClz)
+                || GenericUDAFResolver.class.isAssignableFrom(functionClz)
                 || UDAF.class.isAssignableFrom(functionClz)) {
 
             if (GenericUDAFResolver2.class.isAssignableFrom(functionClz)) {
                 LOG.info(
                         "Transforming Hive function '{}' into a 
HiveGenericUDAF without UDAF bridging",
                         name);
-                return new HiveGenericUDAF(new 
HiveFunctionWrapper<>(functionClz), false, hiveShim);
+                return new HiveGenericUDAF(
+                        new HiveFunctionWrapper<>(functionClz), false, true, 
hiveShim);
+            } else if 
(GenericUDAFResolver.class.isAssignableFrom(functionClz)) {
+                LOG.info(
+                        "Transforming Hive function '{}' into a 
HiveGenericUDAF without UDAF bridging",
+                        name);
+                return new HiveGenericUDAF(
+                        new HiveFunctionWrapper<>(functionClz), false, false, 
hiveShim);
             } else {
                 LOG.info(
                         "Transforming Hive function '{}' into a 
HiveGenericUDAF with UDAF bridging",
                         name);
 
-                return new HiveGenericUDAF(new 
HiveFunctionWrapper<>(functionClz), true, hiveShim);
+                return new HiveGenericUDAF(
+                        new HiveFunctionWrapper<>(functionClz), true, false, 
hiveShim);
             }
         } else {
             throw new IllegalArgumentException(
diff --git 
a/flink-connectors/flink-connector-hive/src/main/java/org/apache/flink/table/functions/hive/HiveGenericUDAF.java
 
b/flink-connectors/flink-connector-hive/src/main/java/org/apache/flink/table/functions/hive/HiveGenericUDAF.java
index c15b5d85255..e396038077e 100644
--- 
a/flink-connectors/flink-connector-hive/src/main/java/org/apache/flink/table/functions/hive/HiveGenericUDAF.java
+++ 
b/flink-connectors/flink-connector-hive/src/main/java/org/apache/flink/table/functions/hive/HiveGenericUDAF.java
@@ -42,6 +42,7 @@ import 
org.apache.hadoop.hive.ql.udf.generic.GenericUDAFBridge;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFResolver;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFResolver2;
+import org.apache.hadoop.hive.ql.udf.generic.SimpleGenericUDAFParameterInfo;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 
 import java.util.Arrays;
@@ -59,6 +60,8 @@ public class HiveGenericUDAF
     // Flag that indicates whether a bridge between GenericUDAF and UDAF is 
required.
     // Old UDAF can be used with the GenericUDAF infrastructure through 
bridging.
     private final boolean isUDAFBridgeRequired;
+    // Flag that indicates whether the GenericUDAF implement 
GenericUDAFResolver2
+    private final boolean isUDAFResolve2;
     private final HiveShim hiveShim;
 
     private HiveFunctionArguments arguments;
@@ -70,17 +73,14 @@ public class HiveGenericUDAF
     private transient boolean allIdentityConverter;
     private transient boolean initialized;
 
-    public HiveGenericUDAF(
-            HiveFunctionWrapper<GenericUDAFResolver> funcWrapper, HiveShim 
hiveShim) {
-        this(funcWrapper, false, hiveShim);
-    }
-
     public HiveGenericUDAF(
             HiveFunctionWrapper<GenericUDAFResolver> funcWrapper,
             boolean isUDAFBridgeRequired,
+            boolean isUDAFResolve2,
             HiveShim hiveShim) {
         this.hiveFunctionWrapper = funcWrapper;
         this.isUDAFBridgeRequired = isUDAFBridgeRequired;
+        this.isUDAFResolve2 = isUDAFResolve2;
         this.hiveShim = hiveShim;
     }
 
@@ -125,15 +125,7 @@ public class HiveGenericUDAF
 
     public GenericUDAFEvaluator createEvaluator(ObjectInspector[] 
inputInspectors)
             throws SemanticException {
-        GenericUDAFResolver2 resolver;
-
-        if (isUDAFBridgeRequired) {
-            resolver = new GenericUDAFBridge((UDAF) 
hiveFunctionWrapper.createFunction());
-        } else {
-            resolver = (GenericUDAFResolver2) 
hiveFunctionWrapper.createFunction();
-        }
-
-        return resolver.getEvaluator(
+        SimpleGenericUDAFParameterInfo parameterInfo =
                 hiveShim.createUDAFParameterInfo(
                         inputInspectors,
                         // The flag to indicate if the UDAF invocation was 
from the windowing
@@ -153,7 +145,18 @@ public class HiveGenericUDAF
                         // function implementation
                         // is not expected to ensure the wildcard handling of 
the target relation.
                         // That is handled by the framework.
-                        Boolean.FALSE));
+                        Boolean.FALSE);
+
+        if (isUDAFBridgeRequired) {
+            return new GenericUDAFBridge((UDAF) 
hiveFunctionWrapper.createFunction())
+                    .getEvaluator(parameterInfo);
+        } else if (isUDAFResolve2) {
+            return ((GenericUDAFResolver2) 
hiveFunctionWrapper.createFunction())
+                    .getEvaluator(parameterInfo);
+        } else {
+            // otherwise, it's instance of GenericUDAFResolver
+            return 
hiveFunctionWrapper.createFunction().getEvaluator(parameterInfo.getParameters());
+        }
     }
 
     /**
diff --git 
a/flink-connectors/flink-connector-hive/src/test/java/org/apache/flink/table/functions/hive/HiveGenericUDAFTest.java
 
b/flink-connectors/flink-connector-hive/src/test/java/org/apache/flink/table/functions/hive/HiveGenericUDAFTest.java
index 771d85cef9e..49ca87f3484 100644
--- 
a/flink-connectors/flink-connector-hive/src/test/java/org/apache/flink/table/functions/hive/HiveGenericUDAFTest.java
+++ 
b/flink-connectors/flink-connector-hive/src/test/java/org/apache/flink/table/functions/hive/HiveGenericUDAFTest.java
@@ -22,7 +22,9 @@ import org.apache.flink.table.api.DataTypes;
 import org.apache.flink.table.catalog.hive.client.HiveShimLoader;
 import org.apache.flink.table.types.DataType;
 import org.apache.flink.table.types.inference.utils.CallContextMock;
+import org.apache.flink.types.Row;
 
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFContextNGrams;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFCount;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFMin;
@@ -47,7 +49,7 @@ public class HiveGenericUDAFTest {
 
         DataType[] argTypes = new DataType[] {DataTypes.BIGINT()};
 
-        HiveGenericUDAF udf = init(GenericUDAFMin.class, constantArgs, 
argTypes);
+        HiveGenericUDAF udf = init(GenericUDAFMin.class, constantArgs, 
argTypes, false, true);
 
         GenericUDAFEvaluator.AggregationBuffer acc = udf.createAccumulator();
 
@@ -66,7 +68,7 @@ public class HiveGenericUDAFTest {
 
         DataType[] argTypes = new DataType[] {DataTypes.DOUBLE()};
 
-        HiveGenericUDAF udf = init(GenericUDAFSum.class, constantArgs, 
argTypes);
+        HiveGenericUDAF udf = init(GenericUDAFSum.class, constantArgs, 
argTypes, false, true);
 
         GenericUDAFEvaluator.AggregationBuffer acc = udf.createAccumulator();
 
@@ -82,7 +84,7 @@ public class HiveGenericUDAFTest {
 
         argTypes = new DataType[] {DataTypes.DECIMAL(5, 3)};
 
-        udf = init(GenericUDAFSum.class, constantArgs, argTypes);
+        udf = init(GenericUDAFSum.class, constantArgs, argTypes, false, true);
 
         acc = udf.createAccumulator();
 
@@ -101,7 +103,7 @@ public class HiveGenericUDAFTest {
 
         DataType[] argTypes = new DataType[] {DataTypes.DOUBLE()};
 
-        HiveGenericUDAF udf = init(GenericUDAFCount.class, constantArgs, 
argTypes);
+        HiveGenericUDAF udf = init(GenericUDAFCount.class, constantArgs, 
argTypes, false, true);
 
         GenericUDAFEvaluator.AggregationBuffer acc = udf.createAccumulator();
 
@@ -114,8 +116,36 @@ public class HiveGenericUDAFTest {
         assertThat(udf.getValue(acc)).isEqualTo(3L);
     }
 
+    @Test
+    public void testUDAFResolver() throws Exception {
+        // test the Hive's UDAF that implement deprecated GenericUDAFResolver 
interface
+        Object[] constantArgs = new Object[] {null, null, null};
+        DataType[] argTypes =
+                new DataType[] {
+                    DataTypes.ARRAY(DataTypes.STRING()),
+                    DataTypes.ARRAY(DataTypes.STRING()),
+                    DataTypes.INT()
+                };
+
+        HiveGenericUDAF udaf =
+                init(GenericUDAFContextNGrams.class, constantArgs, argTypes, 
false, false);
+
+        GenericUDAFEvaluator.AggregationBuffer acc = udaf.createAccumulator();
+
+        udaf.accumulate(
+                acc, new Object[] {"what", "i", "think"}, new Object[] 
{"what", "i", null}, 1);
+
+        udaf.merge(acc, Collections.emptyList());
+        assertThat(Arrays.toString((Row[]) 
udaf.getValue(acc))).isEqualTo("[+I[[think], 1.0]]");
+    }
+
     private static HiveGenericUDAF init(
-            Class<?> hiveUdfClass, Object[] constantArgs, DataType[] argTypes) 
throws Exception {
+            Class<?> hiveUdfClass,
+            Object[] constantArgs,
+            DataType[] argTypes,
+            boolean isUDAFBridgeRequired,
+            boolean isUDAFResolve2)
+            throws Exception {
         HiveFunctionWrapper<GenericUDAFResolver> wrapper = new 
HiveFunctionWrapper<>(hiveUdfClass);
 
         CallContextMock callContext = new CallContextMock();
@@ -127,7 +157,10 @@ public class HiveGenericUDAFTest {
 
         HiveGenericUDAF udf =
                 new HiveGenericUDAF(
-                        wrapper, 
HiveShimLoader.loadHiveShim(HiveShimLoader.getHiveVersion()));
+                        wrapper,
+                        isUDAFBridgeRequired,
+                        isUDAFResolve2,
+                        
HiveShimLoader.loadHiveShim(HiveShimLoader.getHiveVersion()));
 
         udf.setArguments(callContext);
         udf.inferReturnType();

Reply via email to