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.

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.
