Funciones de Hive: Ejemplo de funciones integradas y definidas por el usuario (UDF)

โšก Resumen inteligente

Las funciones de Hive se dividen en dos grupos: funciones integradas que vienen con el motor y cubren la recopilaciรณn, la fecha, las operaciones matemรกticas, condicionales, de cadena y trabajos diversos, y funciones definidas por el usuario escritas en Java para la lรณgica que Hive no proporciona.

  • ๐Ÿ“š Seis familias integradas: Las funciones de colecciรณn, fecha, matemรกticas, condicionales, de cadena y otras funciones diversas se pueden invocar directamente dentro de HiveQL.
  • ๐Ÿงพ Las firmas importan: Cada funciรณn tiene una lista fija de argumentos y un tipo de retorno documentado, por lo que el tipo de retorno determina dรณnde se puede utilizar.
  • ๐Ÿงฉ UDF cubre las deficiencias: Cuando no existe ninguna funciรณn incorporada, una Java La clase que extiende org.apache.hadoop.hive.ql.exec.UDF proporciona la operaciรณn que falta.
  • ๐Ÿ”ข Tres formas de funciรณn personalizada: UDF devuelve una fila por fila, UDAF colapsa varias filas en una sola y UDTF expande una fila en varias.
  • ๐Ÿ› ๏ธ Inscripciรณn en dos pasos: ADD JAR coloca el cรณdigo en el classpath y CREATE TEMPORARY FUNCTION vincula un nombre a la clase.
  • โ™ป๏ธ La clave estรก en la reutilizaciรณn: Una funciรณn definida por el usuario (UDF) probada, como por ejemplo un lematizador, puede llamarse desde cada consulta en lugar de tener que reescribirse cada vez.

Funciones de Hive: Funciones integradas y definidas por el usuario

Las funciones se crean con un propรณsito especรญfico para realizar operaciones como operaciones matemรกticas, aritmรฉticas, lรณgicas y relacionales sobre los operandos de los nombres de las columnas de la tabla.

Funciones integradas

Estas son funciones que ya estรกn disponibles en Hive. Primero, tenemos que verificar los requisitos de la aplicaciรณn y luego podremos usar estas funciones integradas en nuestras aplicaciones. Podemos llamar a estas funciones directamente en nuestra aplicaciรณn.

La sintaxis y los tipos se mencionan en la siguiente secciรณn.

Tipos de funciones integradas en Hive:

  • Funciones de colecciรณn
  • Funciones de fecha
  • Funciones Matemรกticas
  • Funciones condicionales
  • Funciones de cadena
  • Varios. Funciones

Cada una de las seis familias se describe a continuaciรณn con sus firmas de funciรณn y tipos de retorno.

Funciones de colecciรณn

Estas funciones se utilizan para colecciones. Las colecciones significan el grupoping de elementos, y devuelven un solo elemento o una matriz de elementos dependiendo del tipo de retorno mencionado en el nombre de la funciรณn.

Tipo de retorno Nombre de la funciรณn Mareas Ideales para Lecciones
INT tamaรฑo(Mapa) Obtendrรก y devolverรก el nรบmero de componentes en el tipo de mapa.
INT tamaรฑo (matriz ) Obtendrรก y devolverรก el nรบmero de elementos en el tipo de matriz.
Matriz claves_mapa(Mapa ) Obtendrรก y devolverรก un array que contiene las claves del mapa de entrada. El array no estรก ordenado.
Matriz map_values(Map ) Obtendrรก y devolverรก un array que contiene los valores del mapa de entrada. El array no estรก ordenado.
Formaciรณn ordenar_array(Array) ) Ordena el array de entrada en orden ascendente de sus elementos y lo devuelve.
Boolean array_contiene(Array , valor) Devuelve TRUE si el array contiene el valor pasado como segundo argumento.

Funciones de fecha

Estas funciones se utilizan para realizar manipulaciones de fechas y conversiones de tipos de fecha de un tipo a otro:

Nombre de la funciรณn Tipo de retorno Mareas Ideales para Lecciones
unix_timestamp() BigInt Obtendremos la versiรณn actual Unix Marca de tiempo en segundos. El valor no es fijo para toda la consulta.
fecha_a_fecha(cadena marca_de_tiempo) datos Obtendrรก y devolverรก la parte de la fecha de una cadena de marca de tiempo.
aรฑo (fecha de cadena) INT Buscarรก y le darรก al aรฑo parte de una fecha o una cadena de marca de tiempo.
trimestre(fecha/marca de tiempo/cadena) INT Buscarรก y proporcionarรก el trimestre del aรฑo para una fecha, marca de tiempo o cadena en el rango del 1 al 4.
mes (fecha de cadena) INT Le darรก al mes parte de una fecha o una cadena de marca de tiempo.
hora (fecha de cadena) INT Obtendrรก y mostrarรก la hora de la marca de tiempo.
minuto (fecha de cadena) INT Obtendrรก y mostrarรก el minuto de la marca de tiempo.
fecha_sub(cadena fecha de inicio, entero dรญas) datos Obtendrรก y darรก el resultado de la subtracun nรบmero de dรญas a partir de la fecha de inicio
fecha_actual datos Obtendrรก y proporcionarรก la fecha actual al inicio de la evaluaciรณn de la consulta.
รบltimo_dรญa(cadena fecha) cadena Buscarรก y darรก el รบltimo dรญa del mes al que pertenece la fecha.
trunc(fecha de cadena, formato de cadena) cadena Obtendrรก y devolverรก la fecha truncada a la unidad especificada por el formato. Formatos admitidos: MES/MON/MM, Aร‘O/AAAA/AA.

Funciones Matemรกticas

Estas funciones se utilizan para operaciones matemรกticas. En lugar de crear funciones definidas por el usuario (UDF), Hive incluye algunas funciones matemรกticas integradas.

Nombre de la funciรณn Tipo de retorno Mareas Ideales para Lecciones
redondo(DOBLE X) DOBLE Obtendrรก y devolverรก el valor BIGINT redondeado de X.
ronda(DOBLE X, INT d) DOBLE Obtendrรก y devolverรก X redondeado a d decimales.
Bround(DOBLE X) DOBLE Obtendrรก y devolverรก el valor BIGINT redondeado de X utilizando el modo de redondeo HALF_EVEN, tambiรฉn conocido como redondeo bancario.
piso(DOBLE X) EMPEZANDO Obtendrรก y devolverรก el valor BIGINT mรกximo que sea igual o menor que el valor X.
techo(DOBLE a), techo(DOBLE a) EMPEZANDO Obtendrรก y devolverรก el valor BIGINT mรญnimo que sea igual o mayor que el valor a.
rand(), rand(semilla INT) DOBLE Obtendrรก y devolverรก un nรบmero aleatorio que se distribuye uniformemente entre 0 y 1. Proporcionar una semilla hace que la secuencia sea repetible.

Funciones condicionales

Estas funciones se utilizan para realizar comprobaciones de valores condicionales.

Nombre de la funciรณn Tipo de retorno Mareas Ideales para Lecciones
if(Condiciรณn de prueba booleana, valor T Verdadero, valor T Falso o nulo) T Devolverรก valueTrue cuando testCondition sea verdadero, y valueFalseOrNull en caso contrario.
es nulo(X) Boolean Obtendrรก el valor y devolverรก verdadero si X es NULO y falso en caso contrario.
no es nulo(X) Boolean Obtendrรก el valor y devolverรก verdadero si X no es NULO y falso en caso contrario.
nvl(T valor, T valor_predeterminado) T Devolverรก default_value cuando value sea NULL, y value en caso contrario.

Funciones de cadena

Las siguientes funciones se encargan de la manipulaciรณn y las operaciones con cadenas de texto.

Nombre de la funciรณn Tipo de retorno Mareas Ideales para Lecciones
invertir(cadena X) cadena Darรก la cadena invertida de X
rpad(cadena de cadena, longitud int, pad de cadena) cadena Obtendrรก y devolverรก str con relleno a la derecha hasta una longitud total de longitud.
rtrim(cadena X) cadena Obtendrรก y devolverรก la cadena resultante de recortar los espacios del final (lado derecho) de X.
Por ejemplo, , rtrim('resultados') da como resultado 'resultados'
espacio(INT n) cadena Obtendrรก y devolverรก una cadena de n espacios.
dividir(STRING str, STRING palmadita) matriz Divide str alrededor de pat (pat es una expresiรณn regular).
str_to_map(texto[, delimitador1, delimitador2]) mapa Dividirรก el texto en pares clave-valor utilizando dos delimitadores. El delimitador 1 separa los pares y el delimitador 2 divide cada par.

Varios. Funciones

Varias funciones integradas no pertenecen a ninguna de las familias anteriores. Estas abarcan el hash, la informaciรณn de sesiรณn y la llamada a funciones arbitrarias. Java mรฉtodos.

Nombre de la funciรณn Tipo de retorno Mareas Ideales para Lecciones
hash(a1[, a2โ€ฆ]) INT Devuelve un valor hash de los argumentos.
usuario_actual() cadena Devuelve el nombre de usuario actual del administrador de autenticaciรณn configurado.
base_de_datos_actual() cadena Devuelve el nombre de la base de datos actual.
md5 (cadena/binario) cadena Devuelve la suma de comprobaciรณn MD5 de 128 bits como una cadena de 32 dรญgitos hexadecimales, o NULL si el argumento es NULL.
sha1(cadena/binario) cadena Devuelve el resumen SHA-1 del argumento como una cadena hexadecimal.
crc32(cadena/binario) BigInt Devuelve el valor de comprobaciรณn de redundancia cรญclica de un argumento de cadena o binario.
versiรณn() cadena Devuelve la versiรณn de Hive como un nรบmero de compilaciรณn seguido de un hash de compilaciรณn.
reflejar(clase, mรฉtodo[, arg1โ€ฆ]) varรญa Llama a un Java mรฉtodo mediante la coincidencia de la firma del argumento, utilizando reflexiรณn. java_method() es un sinรณnimo

UDF (funciones definidas por el usuario)

En Hive, los usuarios pueden definir sus propias funciones para satisfacer ciertos requisitos del cliente. Estas se conocen como UDF en Hive. Las funciones definidas por el usuario se escriben en Java para mรณdulos especรญficos.

Algunas UDF estรกn diseรฑadas especรญficamente para la reutilizaciรณn de cรณdigo en marcos de aplicaciones. El desarrollador escribe estas funciones en Java e integra esas funciones definidas por el usuario con Hive.

Durante la ejecuciรณn de la consulta, el desarrollador puede usar el cรณdigo directamente, y las funciones definidas por el usuario (UDF) devolverรกn resultados segรบn las tareas definidas por el usuario. Esto proporciona un alto rendimiento tanto en la codificaciรณn como en la ejecuciรณn.

Por ejemplo, para la lematizaciรณn de cadenas no tenemos ninguna funciรณn predefinida en Hive. Para ello, podemos escribir una UDF de lematizaciรณn en JavaSiempre que necesitemos la funcionalidad de stem, podemos llamar directamente a esta UDF de stem en Hive.

Aquรญ, la funcionalidad de derivaciรณn significa obtener palabras a partir de sus palabras raรญz. Un algoritmo de derivaciรณn reduce las palabras "desear", "deseado" y "deseos" a la palabra raรญz "deseo". Para realizar este tipo de funcionalidad, podemos escribir una UDF en Java e integrarlo con Colmena.

Dependiendo del caso de uso, la funciรณn definida por el usuario (UDF) puede escribirse para aceptar y producir diferentes cantidades de valores de entrada y salida.

El tipo general de funciรณn definida por el usuario (UDF) acepta un รบnico valor de entrada y produce un รบnico valor de salida. Si la UDF se utiliza en una consulta, se llamarรก una vez por cada fila del conjunto de datos resultante.

En sentido contrario, una funciรณn puede aceptar un grupo de valores como entrada y devolver un รบnico valor de salida. Esa diferencia es lo que distingue a los tres tipos de funciones personalizadas que se describen a continuaciรณn.

UDF vs UDAF vs UDTF en Hive

Las funciones personalizadas en Hive se agrupan segรบn la cantidad de filas que ingresan y las que generan. Elegir el tipo incorrecto es la razรณn mรกs comรบn por la que una funciรณn personalizada no se compila o devuelve una sola fila en lugar de una tabla.

Tipo Filas de entrada โ†’ filas de salida Clase para extender Ejemplos integrados
UDF Una fila โ†’ una fila org.apache.hadoop.hive.ql.exec.UDF longitud(), redondeo(), reversa()
UDAF Muchas filas โ†’ una fila org.apache.hadoop.hive.ql.udf.generic.AbstractGenericUDAFResolver contador(), mรญnimo(), mรกximo()
UDTF Una fila โ†’ muchas filas org.apache.hadoop.hive.ql.udf.generic.GenericUDTF explode(), json_tuple(), parse_url_tuple()

De la tabla se desprenden dos reglas prรกcticas:

  • Una funciรณn definida por el usuario (UDAF) casi siempre se combina con una clรกusula GROUP BY, porque reduce cada grupo a una sola fila.
  • Una funciรณn definida por el usuario (UDTF) no se puede seleccionar junto con otras columnas en la misma lista SELECT, por lo que normalmente se utiliza con una vista lateral (LATERAL VIEW).

Tambiรฉn existe una segunda clase base mรกs potente para trabajar a nivel de fila, GenericUDF, que acepta tipos complejos como matrices, mapas y estructuras, asรญ como un nรบmero variable de argumentos.

Cรณmo escribir y registrar una UDF en Hive

El ejemplo de tallo descrito anteriormente se puede construir como una funciรณn real en cuatro pasos. Nada mรกs allรก de un Java Se requiere un compilador y una sesiรณn de Hive en ejecuciรณn.

Paso 1) Escribir el Java Clase que extiende UDF e implementa un mรฉtodo pรบblico evaluate(). Hive llama a evaluate() una vez por fila, por lo que el mรฉtodo debe manejar una entrada NULL.

package com.guru99.hive.udf;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

public final class Stem extends UDF {

    public Text evaluate(final Text input) {
        if (input == null) {
            return null;
        }
        String word = input.toString().toLowerCase();
        if (word.endsWith("ing")) {
            word = word.substring(0, word.length() - 3);
        } else if (word.endsWith("ed") || word.endsWith("es")) {
            word = word.substring(0, word.length() - 2);
        }
        return new Text(word);
    }
}

Paso 2) Compile la clase y empaquรฉtela en un archivo JAR, por ejemplo hive-udf-1.0.jar, junto con todas las clases de las que dependa.

Paso 3) Coloca el archivo JAR en la ruta de clases de Hive y asigna un nombre de funciรณn a la clase. Una funciรณn temporal solo existe durante la sesiรณn actual.

ADD JAR /home/hduser/hive-udf-1.0.jar;

CREATE TEMPORARY FUNCTION stem AS 'com.guru99.hive.udf.Stem';

Paso 4) Llama a la nueva funciรณn exactamente como si fuera una funciรณn integrada. Aplicada a las palabras โ€œwishingโ€, โ€œwishedโ€ y โ€œwishesโ€, esta clase devuelve โ€œwishโ€ para las tres.

SELECT word, stem(word) FROM words;

Para que la funciรณn estรฉ disponible para todas las sesiones y todos los usuarios, regรญstrela permanentemente en una base de datos. El archivo JAR debe estar ubicado en una ruta de acceso que todo el clรบster pueda leer, lo que normalmente significa HDFS.

CREATE FUNCTION default.stem AS 'com.guru99.hive.udf.Stem'
USING JAR '/user/hive/udfs/hive-udf-1.0.jar';

Una misma clase puede declarar mรกs de un mรฉtodo evaluate(). Hive compara la llamada con las firmas de los argumentos, lo que permite que una funciรณn acepte tanto una cadena como un nรบmero entero.

Preguntas Frecuentes

SHOW FUNCTIONS muestra todos los nombres registrados, incluidos los personalizados. DESCRIBE FUNCTION nombre imprime una firma de una lรญnea, y DESCRIBE FUNCTION EXTENDED nombre aรฑade ejemplos de uso cuando la clase que los implementa los proporciona.

Casi siempre se trata de un problema de nombre o รกmbito: la cadena que sigue a AS debe ser el nombre de clase completo, y ADD JAR solo se aplica a la sesiรณn que lo ejecutรณ. Al reconectar, se eliminan tanto el JAR como cualquier funciรณn temporal.

Utilice GenericUDF cuando la funciรณn acepte tipos complejos como matrices, mapas o estructuras, un nรบmero variable de argumentos o necesite validar los tipos de argumentos por sรญ misma. La clase UDF simple resuelve los tipos mediante reflexiรณn y solo maneja tipos primitivos Writable.

Una UDF verdadera debe ejecutarse en la JVM. Para otros lenguajes, Colmena ofrece la clรกusula TRANSFORM, que transmite cada fila a travรฉs de un script externo como Python a travรฉs de la entrada y salida estรกndar. Es mรกs lento pero evita Java enteramente.

Sรญ, pueden. La funciรณn evaluate() se ejecuta una vez por fila, por lo que la lรณgica costosa se multiplica por el nรบmero de filas, y la asignaciรณn de objetos dentro del mรฉtodo aumenta la presiรณn sobre el recolector de basura. Es preferible usar una funciรณn integrada cuando exista, y mantener evaluate() libre de operaciones de entrada/salida.

No. Los nombres de las funciones no distinguen entre mayรบsculas y minรบsculas, por lo que ROUND(), Round() y round() son la misma funciรณn. Java El nombre de la clase en la clรกusula AS es un asunto distinto y debe coincidir exactamente con la clase compilada, incluido su paquete.

Los asistentes de aprendizaje automรกtico asignan una descripciรณn en lenguaje natural a las firmas candidatas y advierten cuando un tipo de retorno no se ajusta a la columna de destino. Verifique la sugerencia con la firma documentada, ya que los nombres generados a veces pertenecen a otro dialecto SQL.

Genera un esqueleto funcional โ€”la declaraciรณn de la clase, las importaciones y un mรฉtodo evaluate()โ€” a partir de un comentario que describe la operaciรณn. El manejo de valores nulos, los tipos modificables y el proceso de empaquetado aรบn requieren revisiรณn, y la funciรณn debe probarse con filas reales.

Resumir este post con: