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
- Función de soltar: función de soltar <udf>
- Cree una función temporal: cree una función temporal <udf> como <udf.class.path>