Search in sources :

Example 1 with UDF

use of org.apache.hadoop.hive.ql.exec.UDF in project presto by prestodb.

the class HiveScalarFunctionInvoker method createFunctionInvoker.

public static HiveScalarFunctionInvoker createFunctionInvoker(Class<?> cls, QualifiedObjectName name, List<TypeSignature> arguments, TypeManager typeManager) {
    final List<Type> argumentTypes = arguments.stream().map(typeManager::getType).collect(Collectors.toList());
    try {
        // Step 1: Create function instance
        final GenericUDF udf = createGenericUDF(name, cls);
        // Step 2: Initialize function
        ObjectInspector[] inputInspectors = argumentTypes.stream().map(argumentType -> ObjectInspectors.create(argumentType, typeManager)).toArray(ObjectInspector[]::new);
        ObjectInspector resultInspector = udf.initialize(inputInspectors);
        // Step 3: Create invoker
        Type resultType = PrestoTypes.fromObjectInspector(resultInspector, typeManager);
        ObjectInputDecoder[] argumentDecoders = argumentTypes.stream().map(argumentsType -> createDecoder(argumentsType, typeManager)).toArray(ObjectInputDecoder[]::new);
        ObjectEncoder resultEncoder = createEncoder(resultType, resultInspector);
        Signature signature = new Signature(name, SCALAR, resultType.getTypeSignature(), arguments);
        // Step 4: Create ThreadLocal GenericUDF
        final ThreadLocal<GenericUDF> genericUDFSupplier = ThreadLocal.withInitial(() -> {
            try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(cls.getClassLoader())) {
                GenericUDF ret = createGenericUDF(name, cls);
                ret.initialize(inputInspectors);
                return ret;
            } catch (Exception e) {
                throw initializationError(e);
            }
        });
        return new HiveScalarFunctionInvoker(signature, genericUDFSupplier::get, argumentDecoders, resultEncoder);
    } catch (Exception e) {
        throw initializationError(e);
    }
}
Also used : Constructor(java.lang.reflect.Constructor) Supplier(java.util.function.Supplier) TypeSignature(com.facebook.presto.common.type.TypeSignature) DeferredObject(org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredObject) UDF(org.apache.hadoop.hive.ql.exec.UDF) DeferredJavaObject(org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredJavaObject) ObjectEncoders.createEncoder(com.facebook.presto.hive.functions.type.ObjectEncoders.createEncoder) TypeManager(com.facebook.presto.common.type.TypeManager) HiveFunctionErrorCode.initializationError(com.facebook.presto.hive.functions.HiveFunctionErrorCode.initializationError) Objects.requireNonNull(java.util.Objects.requireNonNull) QualifiedObjectName(com.facebook.presto.common.QualifiedObjectName) ThreadContextClassLoader(com.facebook.presto.spi.classloader.ThreadContextClassLoader) ObjectInspector(org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector) Type(com.facebook.presto.common.type.Type) GenericUDF(org.apache.hadoop.hive.ql.udf.generic.GenericUDF) ObjectInputDecoders.createDecoder(com.facebook.presto.hive.functions.type.ObjectInputDecoders.createDecoder) ObjectInputDecoder(com.facebook.presto.hive.functions.type.ObjectInputDecoder) GenericUDFBridge(org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge) PrestoTypes(com.facebook.presto.hive.functions.type.PrestoTypes) Collectors(java.util.stream.Collectors) SCALAR(com.facebook.presto.spi.function.FunctionKind.SCALAR) InvocationTargetException(java.lang.reflect.InvocationTargetException) HiveFunctionErrorCode.unsupportedFunctionType(com.facebook.presto.hive.functions.HiveFunctionErrorCode.unsupportedFunctionType) List(java.util.List) ObjectEncoder(com.facebook.presto.hive.functions.type.ObjectEncoder) ObjectInspectors(com.facebook.presto.hive.functions.type.ObjectInspectors) Signature(com.facebook.presto.spi.function.Signature) HiveException(org.apache.hadoop.hive.ql.metadata.HiveException) HiveFunctionErrorCode.executionError(com.facebook.presto.hive.functions.HiveFunctionErrorCode.executionError) ObjectInspector(org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector) InvocationTargetException(java.lang.reflect.InvocationTargetException) HiveException(org.apache.hadoop.hive.ql.metadata.HiveException) Type(com.facebook.presto.common.type.Type) HiveFunctionErrorCode.unsupportedFunctionType(com.facebook.presto.hive.functions.HiveFunctionErrorCode.unsupportedFunctionType) GenericUDF(org.apache.hadoop.hive.ql.udf.generic.GenericUDF) ObjectInputDecoder(com.facebook.presto.hive.functions.type.ObjectInputDecoder) TypeSignature(com.facebook.presto.common.type.TypeSignature) Signature(com.facebook.presto.spi.function.Signature) ObjectEncoder(com.facebook.presto.hive.functions.type.ObjectEncoder) ThreadContextClassLoader(com.facebook.presto.spi.classloader.ThreadContextClassLoader)

Example 2 with UDF

use of org.apache.hadoop.hive.ql.exec.UDF in project hive by apache.

the class VectorizationContext method getGenericUDFForCast.

public static GenericUDF getGenericUDFForCast(TypeInfo castType) throws HiveException {
    UDF udfClass = null;
    GenericUDF genericUdf = null;
    switch(((PrimitiveTypeInfo) castType).getPrimitiveCategory()) {
        case BYTE:
            udfClass = new UDFToByte();
            break;
        case SHORT:
            udfClass = new UDFToShort();
            break;
        case INT:
            udfClass = new UDFToInteger();
            break;
        case LONG:
            udfClass = new UDFToLong();
            break;
        case FLOAT:
            udfClass = new UDFToFloat();
            break;
        case DOUBLE:
            udfClass = new UDFToDouble();
            break;
        case STRING:
            genericUdf = new GenericUDFToString();
            break;
        case CHAR:
            genericUdf = new GenericUDFToChar();
            break;
        case VARCHAR:
            genericUdf = new GenericUDFToVarchar();
            break;
        case BOOLEAN:
            udfClass = new UDFToBoolean();
            break;
        case DATE:
            genericUdf = new GenericUDFToDate();
            break;
        case TIMESTAMP:
            genericUdf = new GenericUDFTimestamp();
            break;
        case INTERVAL_YEAR_MONTH:
            genericUdf = new GenericUDFToIntervalYearMonth();
            break;
        case INTERVAL_DAY_TIME:
            genericUdf = new GenericUDFToIntervalDayTime();
            break;
        case BINARY:
            genericUdf = new GenericUDFToBinary();
            break;
        case DECIMAL:
            genericUdf = new GenericUDFToDecimal();
            break;
        case VOID:
        case UNKNOWN:
            // fall-through to throw exception, its not expected for execution to reach here.
            break;
    }
    if (genericUdf == null) {
        if (udfClass == null) {
            throw new HiveException("Could not add implicit cast for type " + castType.getTypeName());
        }
        GenericUDFBridge genericUDFBridge = new GenericUDFBridge();
        genericUDFBridge.setUdfClassName(udfClass.getClass().getName());
        genericUDFBridge.setUdfName(udfClass.getClass().getSimpleName());
        genericUdf = genericUDFBridge;
    }
    if (genericUdf instanceof SettableUDF) {
        ((SettableUDF) genericUdf).setTypeInfo(castType);
    }
    return genericUdf;
}
Also used : HiveException(org.apache.hadoop.hive.ql.metadata.HiveException) PrimitiveTypeInfo(org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo) UDF(org.apache.hadoop.hive.ql.exec.UDF)

Example 3 with UDF

use of org.apache.hadoop.hive.ql.exec.UDF in project hive by apache.

the class ConstantPropagateProcFactory method isDeterministicUdf.

private static boolean isDeterministicUdf(GenericUDF udf, List<ExprNodeDesc> children) {
    UDFType udfType = udf.getClass().getAnnotation(UDFType.class);
    if (udf instanceof GenericUDFBridge) {
        udfType = ((GenericUDFBridge) udf).getUdfClass().getAnnotation(UDFType.class);
    }
    if (udfType.deterministic() == false) {
        if (udf.getClass().equals(GenericUDFUnixTimeStamp.class) && children != null && children.size() > 0) {
            // unix_timestamp is polymorphic (ignore class annotations)
            return true;
        }
        return false;
    }
    // If udf is requiring additional jars, we can't determine the result in
    // compile time.
    String[] files;
    String[] jars;
    if (udf instanceof GenericUDFBridge) {
        GenericUDFBridge bridge = (GenericUDFBridge) udf;
        String udfClassName = bridge.getUdfClassName();
        try {
            UDF udfInternal = (UDF) Class.forName(bridge.getUdfClassName(), true, Utilities.getSessionSpecifiedClassLoader()).newInstance();
            files = udfInternal.getRequiredFiles();
            jars = udfInternal.getRequiredJars();
        } catch (Exception e) {
            LOG.error("The UDF implementation class '" + udfClassName + "' is not present in the class path");
            return false;
        }
    } else {
        files = udf.getRequiredFiles();
        jars = udf.getRequiredJars();
    }
    if (files != null || jars != null) {
        return false;
    }
    return true;
}
Also used : UDF(org.apache.hadoop.hive.ql.exec.UDF) GenericUDF(org.apache.hadoop.hive.ql.udf.generic.GenericUDF) UDFType(org.apache.hadoop.hive.ql.udf.UDFType) GenericUDFBridge(org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge) SemanticException(org.apache.hadoop.hive.ql.parse.SemanticException) HiveException(org.apache.hadoop.hive.ql.metadata.HiveException) UDFArgumentException(org.apache.hadoop.hive.ql.exec.UDFArgumentException)

Example 4 with UDF

use of org.apache.hadoop.hive.ql.exec.UDF in project hive by apache.

the class ExprNodeDescUtils method foldConstant.

private static ExprNodeConstantDesc foldConstant(ExprNodeGenericFuncDesc func) {
    GenericUDF udf = func.getGenericUDF();
    if (!FunctionRegistry.isConsistentWithinQuery(udf)) {
        return null;
    }
    try {
        // resources may not be available at compile time.
        if (udf instanceof GenericUDFBridge) {
            UDF internal = ReflectionUtils.newInstance(((GenericUDFBridge) udf).getUdfClass(), null);
            if (internal.getRequiredFiles() != null || internal.getRequiredJars() != null) {
                return null;
            }
        } else {
            if (udf.getRequiredFiles() != null || udf.getRequiredJars() != null) {
                return null;
            }
        }
        if (func.getChildren() != null) {
            for (ExprNodeDesc child : func.getChildren()) {
                if (child instanceof ExprNodeConstantDesc) {
                    continue;
                }
                if (child instanceof ExprNodeGenericFuncDesc) {
                    if (foldConstant((ExprNodeGenericFuncDesc) child) != null) {
                        continue;
                    }
                }
                return null;
            }
        }
        ExprNodeEvaluator evaluator = ExprNodeEvaluatorFactory.get(func);
        ObjectInspector output = evaluator.initialize(null);
        Object constant = evaluator.evaluate(null);
        Object java = ObjectInspectorUtils.copyToStandardJavaObject(constant, output);
        return new ExprNodeConstantDesc(java);
    } catch (Exception e) {
        return null;
    }
}
Also used : PrimitiveObjectInspector(org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector) ObjectInspector(org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector) GenericUDF(org.apache.hadoop.hive.ql.udf.generic.GenericUDF) UDF(org.apache.hadoop.hive.ql.exec.UDF) GenericUDF(org.apache.hadoop.hive.ql.udf.generic.GenericUDF) ExprNodeEvaluator(org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator) GenericUDFBridge(org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge) UDFArgumentException(org.apache.hadoop.hive.ql.exec.UDFArgumentException) SemanticException(org.apache.hadoop.hive.ql.parse.SemanticException)

Example 5 with UDF

use of org.apache.hadoop.hive.ql.exec.UDF in project hive by apache.

the class ConstantPropagateProcFactory method isConstantFoldableUdf.

/**
 * Can the UDF be used for constant folding.
 */
private static boolean isConstantFoldableUdf(GenericUDF udf, List<ExprNodeDesc> children) {
    // Runtime constants + deterministic functions can be folded.
    if (!FunctionRegistry.isConsistentWithinQuery(udf)) {
        if (udf.getClass().equals(GenericUDFUnixTimeStamp.class) && children != null && children.size() > 0) {
            // unix_timestamp is polymorphic (ignore class annotations)
            return true;
        }
        return false;
    }
    // If udf is requiring additional jars, we can't determine the result in
    // compile time.
    String[] files;
    String[] jars;
    if (udf instanceof GenericUDFBridge) {
        GenericUDFBridge bridge = (GenericUDFBridge) udf;
        String udfClassName = bridge.getUdfClassName();
        try {
            UDF udfInternal = (UDF) Class.forName(bridge.getUdfClassName(), true, Utilities.getSessionSpecifiedClassLoader()).newInstance();
            files = udfInternal.getRequiredFiles();
            jars = udfInternal.getRequiredJars();
        } catch (Exception e) {
            LOG.error("The UDF implementation class '" + udfClassName + "' is not present in the class path");
            return false;
        }
    } else {
        files = udf.getRequiredFiles();
        jars = udf.getRequiredJars();
    }
    if (files != null || jars != null) {
        return false;
    }
    return true;
}
Also used : UDF(org.apache.hadoop.hive.ql.exec.UDF) GenericUDF(org.apache.hadoop.hive.ql.udf.generic.GenericUDF) GenericUDFBridge(org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge) SemanticException(org.apache.hadoop.hive.ql.parse.SemanticException) HiveException(org.apache.hadoop.hive.ql.metadata.HiveException) UDFArgumentException(org.apache.hadoop.hive.ql.exec.UDFArgumentException)

Aggregations

UDF (org.apache.hadoop.hive.ql.exec.UDF)6 HiveException (org.apache.hadoop.hive.ql.metadata.HiveException)5 GenericUDF (org.apache.hadoop.hive.ql.udf.generic.GenericUDF)5 GenericUDFBridge (org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge)5 UDFArgumentException (org.apache.hadoop.hive.ql.exec.UDFArgumentException)3 SemanticException (org.apache.hadoop.hive.ql.parse.SemanticException)3 List (java.util.List)2 ExprNodeEvaluator (org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator)2 PrimitiveObjectInspector (org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector)2 QualifiedObjectName (com.facebook.presto.common.QualifiedObjectName)1 Type (com.facebook.presto.common.type.Type)1 TypeManager (com.facebook.presto.common.type.TypeManager)1 TypeSignature (com.facebook.presto.common.type.TypeSignature)1 HiveFunctionErrorCode.executionError (com.facebook.presto.hive.functions.HiveFunctionErrorCode.executionError)1 HiveFunctionErrorCode.initializationError (com.facebook.presto.hive.functions.HiveFunctionErrorCode.initializationError)1 HiveFunctionErrorCode.unsupportedFunctionType (com.facebook.presto.hive.functions.HiveFunctionErrorCode.unsupportedFunctionType)1 ObjectEncoder (com.facebook.presto.hive.functions.type.ObjectEncoder)1 ObjectEncoders.createEncoder (com.facebook.presto.hive.functions.type.ObjectEncoders.createEncoder)1 ObjectInputDecoder (com.facebook.presto.hive.functions.type.ObjectInputDecoder)1 ObjectInputDecoders.createDecoder (com.facebook.presto.hive.functions.type.ObjectInputDecoders.createDecoder)1