Introducción a Hive UDF <Función definida por el usuario>

1. Introducción

Hive tiene tres tipos de UDF: UDF (sin formato) , funciones agregadas definidas por el usuario ( UDAF ) y funciones de generación de tablas definidas por el usuario ( UDTF ).

  • UDF: la operación actúa en una sola fila de datos y produce una fila de datos como salida. La mayoría de las funciones, como las funciones matemáticas y de cadenas, entran en esta categoría.
  • UDAF: acepta múltiples filas de datos de entrada y produce una fila de datos de salida. Por ejemplo, las funciones COUNT y MAX.
  • UDTF: Actúa en una sola fila de datos y genera varias filas de datos (es decir, una tabla) como salida. Por ejemplo, vista alternativa y función de explosión.

Dos, escribe UDF

Antes de desarrollar Hive UDF, debemos introducir un paquete jar: hive-exec.

<dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-exec</artifactId>
    <version>2.1.1</version>
    <scope>provided</scope>
 </dependency>

El alcance predeterminado es compilar, lo que significa que el proyecto necesita este paquete jar en el classpath durante la compilación, prueba y ejecución. Aquí se proporciona el alcance especificado, lo que significa que el paquete Jar solo se requiere en las fases de compilación y prueba. Porque en tiempo de ejecución, Hive ya tiene el paquete Jar, por lo que no es necesario repetir las dependencias.

A continuación, necesitamos implementar la interfaz UDF. Actualmente, la UDF de Hive se divide principalmente en dos tipos de interfaces: UDF y GenericUDF.

  • UDF: es una clase relativamente simple y la clase base heredada es org.apache.hadoop.hive.ql.exec.UDF
  • GenericUDF: Relativamente complejo, principalmente para un mejor control de la verificación de tipos. La clase base heredada es org.apache.hadoop.hive.ql.udf.generic.GenericUDF.

A continuación, veamos una clase de implementación UDF simple: Strip

package com.scb.dss.udf;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;

@Description(name = "strip",
        value = "_FUNC_(str) - Removes the leading and trailing space characters from str.")
public class Strip extends UDF {

    // 去除str开头以及结尾的空格
    public String evaluate(String str) {
        if (str == null) {
            return null;
        }
        return StringUtils.strip(str);
    }

    // 去除str开头以及结尾的stripChars中该指定字符集中的任意字符
    public String evaluate(String str, String stripChars) {
        if (str == null) {
            return null;
        }
        return StringUtils.strip(str, stripChars);
    }
}

La clase Strip tiene dos métodos de evaluación. El primer método eliminará los espacios al principio y al final de str, y el segundo método eliminará cualquier carácter en el conjunto de caracteres especificado en stripChars al principio y al final de str.

La anotación @Description indica la documentación sobre la función UDF, que se puede ver más tarde a través del comando desc function <UDF>. La anotación tiene tres atributos: nombre, valor, extendido.

  • nombre: indica el nombre de la función
  • valor: describe la función de la función, donde _FUNC_ es una definición de macro, que será reemplazada por el nombre real de la función en desc
  • extendido: se utiliza principalmente para escribir ejemplos de uso de funciones

Otros puntos a tener en cuenta:

  • Los nombres UDF no distinguen entre mayúsculas y minúsculas
  • Hive admite el uso de tipos de datos primitivos de Java (así como tipos como java.util.map y java.util.list) en UDF.
  • Hive también admite tipos de datos básicos de Hadoop, como Texto. Se recomienda utilizar los tipos de datos básicos de Hadoop, que pueden aprovechar la reutilización de objetos y aumentar la eficiencia y ahorrar dinero.

A continuación, haga un UT simple

package com.scb.dss.udf;

import org.junit.Assert;
import org.junit.Test;

import static org.junit.Assert.*;

public class StripTest {
    private Strip strip = new Strip();

    @Test
    public void evaluate() {
        System.out.println(strip.evaluate(" a b c "));
        Assert.assertEquals("a b c", strip.evaluate(" a b c "));
        System.out.println(strip.evaluate(" a b c a", "a"));
        Assert.assertEquals(" a b c ", strip.evaluate(" a b c a", "a"));
        System.out.println(strip.evaluate(" a b c a", "a "));
        Assert.assertEquals("b c", strip.evaluate(" a b c a", "a "));
    }
}

3. Implementar UDF

1 paquete

mvn clean package

2. Cargue el paquete Jar a HDFS

hdfs dfs -put hive-udf.jar /user/hive/

3. Conéctese a HIVE a través de beeline

beeline -u jdbc:hive2://host:10000/default -n username -p 'password'

4. Crear función

create function strip as 'com.scb.dss.udf.UDFStrip' using jar 'hdfs:///user/hive/hive-udf.jar';

5. uso

Utilice la función desc <UDF> para ver la información de descripción de UDF.

select strip('0a0', '0'); // elimina el primer 0

4. Otros

  1. Función de soltar: función de soltar <udf>
  2. Cree una función temporal: cree una función temporal <udf> como <udf.class.path>

Supongo que te gusta

Origin blog.csdn.net/qq_37771475/article/details/121636984
Recomendado
Clasificación