Ahora que tenemos instalado Hive en nuestro equipo comenzaremos a aprender como utilizarlo. Dado que trabajar en Hive es similar a trabajar con bases de datos relacionales en cuento al lenguaje de consulta, en este post nos vamos a dedicar a hablar de los tipos de datos y de las funciones predefinidas (Built-in), y en una segunda parte del post hablaremos sobre las funciones definidas por los usuarios (UDF, user defined function) y haremos algunos ejemplos de como trabajar con el HQL y manipular información.

 

qué es Hive

 

Tipos de datos


Los tipos de datos en Hive son clasificados en dos tipos: primitivos y complejos.

Los tipos de datos primitivos incluyen a los enteros (integer), booleanos (boolean), cadenas (string), etc.

Tipo
TINYINT      1 byte
SMALLINT     2 byte
INT          4 byte
BIGINT       8 byte
FLOAT        4 byte
DOUBLE       8 byte
BOOLEAN      TRUE/FALSE
STRING       tamaño máximo 2GB.
TIMESTAMP    almacenar fecha y hora
DATE         almacenar solo fecha

Mientra que los tipos complejos incluyen Arrays, Maps y Structs. Estos tipos de datos son construidos utilizando datos primitivos.

  • Arrays: Contienen una lista de elementos del mismo tipo. Estos elementos son accedidos por un índice. Por ejemplo, si el campo Mascota contiene a lista de elementos [‘perro’, ’gato’, ‘loro’], el elemento ‘gato’ puede ser accedido mediante Mascota[1].
  • Maps: Contienen pares clave-valor. Cada elemento es accedido mediante su clave. Por ejemplo, un map lista_passwords conteniendo “Mauricio” como clave y “passDeMauricio” como valor, el password del usuario es accedido mediante lista_passwords[‘Mauricio’].
  • Structs: Contienen elementos de diferente tipos. Cada elementos puede ser accedido mediante la notación punto (dot notation). Por ejemplo, en una estructura auto, el color del auto puede ser recuperado mediante auto.color.

Ejemplo:

CREATE TABLE complex_data_types
(
  mascota         ARRAY<string>,
  list_passwords  MAP<string,string>,
  auto            STRUCT<color:string, rodado:float>
);

Funciones predefinidas (built-in functions)


Las funciones predefinidas en Hive se clasifican en:

  • Funciones matemáticas y numéricas: principalmente utilizadas para realizar cálculos matemáticos.
  • Funciones de fecha: principalmente utilizadas para realizar operaciones sobre campos tipo fecha (date).
  • Funciones de cadena: usadas para realizar operaciones sobre cadenas (string).
  • Funciones condicionales: usadas para comprobar condiciones, en donde se devuelva una valor Verdadera o False según se cumpla o no la condición.
  • Funciones de acumulación: usadas para encontrar el tamaño de un campo complejo como un array o un map. La única función de este tipo es SIZE, la cual encuentra el número de elementos en uno de estos tipos. La sintaxis de esta función es:
SIZE(Array<A>)
SIZE(MAP<key,value>)
  • Funciones de conversión: usada para convertir un dato de un tipo a otro. La única función de esto tipo es CAST. La sintaxis de esta función es:
CAST(expr as <type>)
  • Funciones generadoras: estas funciones transforman un campo tipo array en múltiples campos. La única función de este tipo es EXPLODE, la cual toma un campo tipo array como entrada, y como salida devuelve los elementos del array en filas separados. Cuando se usa esta función en el SELECT, no se puede especificar ninguna otra columna. La sintaxis de esta función es:
EXPLODE(ARRAY<A>)

 

Funciones matemáticas y numéricas


 

ABS( double n ): valor absoluto de un número.

ABS(-1)

 

ACOS( double n ): arco-coseno de n. En caso de que n no esté en el intervalo [-1; +1] devuelve NULL.

ACOS(0.8)

 

ASIN( double n ): arco-seno de n. En caso de que n no esté en el intervalo [-1; +1] devuelve NULL.

ASIN(0.2)

 

BIN( bigint n ): convierte n a formato binario.

BIN(25)

 

CEIL( double n ), CEILING( double n ): redondea el valora decimal n al entero más cercano más pequeño.

CEIL(5.25)

 

CONV( bigint n, int from_base, int to_base ): convierte un número de una base a otra.

CONV(100, 10,2)

 

COS( double n ): devuelve el coseno de n, el cual debe estar indicado en radianes.

COS(3.14)

 

EXP( double n ): devuelve e^n.

EXP(5)

 

FLOOR( double n ): devuelve el entero superior más cercano a n.

FLOOR(10.9)

 

HEX( bigint n ): convierte el valor n a hexadecimal.

HEX(17)

 

HEX( string n ): convierte cada caracter en su representación hexadecimal.

HEX(‘ABC’)

 

LN( double n ): devuelve al logaritmo natural de n

LN(1.45)

 

LOG( double b, double n ): devuelve el logaritmo en base b de n.

LOG(3, 66)

 

LOG2( double n ): devuelve el logaritmo en base 2 de n.

LOG2(44)

 

LOG10( double n ): devuelve el logaritmo en base 10 de n.

LOG10(1000)

 

NEGATIVE( int n ),  NEGATIVE( double n ): devuelve el valor negativo de n.

NEGATIVE(10)

 

PMOD( int m, int n ), PMOD( double m, double n ): devuelve el módulo de la división entre m y n.

PMOD(3,2)

 

POSITIVE( int n ), POSITIVE( double n ): devuelve el valor positivo de n.

POSITIVE(-10)

 

POW( double m, double n ), POWER( double m, double n ): devuelve m^n.

POW(10,2)

 

RAND( [int seed] ): devuelve un número aleatorio.

RAND()

 

ROUND( double m[, int n] ): devuelve m redondeado con n decimales.

ROUND(1.456,2)

 

SIN( double n ): seno de n, el cual debe estar indicado en radianes.

SIN(2)

 

SQRT( double n ): raíz cuadrada de n.

SQRT(4)

 

UNHEX( string n ): inversa de la función HEX. Convierte la cadena dada a su formato numérico.

UNHEX(‘AB’)

 

 

Funciones de fecha


 

UNIX_TIMESTAMP(): devuelve la fecha y hora en formato UNIX epoch (número de segundos desde 1970-01-01 00:00:00 UTC).

UNIX_TIMESTAMP() -- returns 1476135611

 

UNIX_TIMESTAMP( string fecha): convierte la fecha en formato ‘yyyy-MM-dd HH:mm:ss’ a formato UNIX epoch, esto es, el número de segundo transcurridos desde 1970-01-01 00:00:00 UTC.

UNIX_TIMESTAMP('2000-01-01 00:00:00') -- returns 946713600

 

UNIX_TIMESTAMP( string fecha, string pattern ): convierte la fecha al formato indicado, y la devuelve esta en formato UNIX epoch.

UNIX_TIMESTAMP('2000-01-01 10:20:30','yyyy-MM-dd') -- returns 946713600

 

FROM_UNIXTIME( bigint number_of_seconds  [, string format] ): convierte la fecha en formato UNIX epoch al formato indicado. Por defecto ‘yyyy-MM-dd HH:mm:ss’.

FROM_UNIXTIME( UNIX_TIMESTAMP() )  -- returns the current date including the time

 

TO_DATE( string timestamp ): devuelve la fecha en formato ‘yyyy-MM-dd’.

TO_DATE('2000-01-01 10:20:30') -- returns '2000-01-01'

 

YEAR( string fecha ): devuelve el año.

YEAR('2000-01-01 10:20:30') -- returns 2000

 

MONTH( string fecha ): devuelve el mes.

MONTH('2000-03-01 10:20:30') -- returns 3

 

DAY( string fecha ), DAYOFMONTH( string fecha): devuelve el día.

DAY('2000-03-01 10:20:30') -- returns 1

 

HOUR( string fecha ): devuelve la hora.

HOUR('2000-03-01 10:20:30') -- returns 10

 

MINUTE( string fecha ): devuelve los minutos.

MINUTE('2000-03-01 10:20:30') -- returns 20

 

SECOND( string fecha ): devuelve los segundos.

SECOND('2000-03-01 10:20:30') -- returns 30

 

WEEKOFYEAR( string fecha ): devuelve el número de semana del año.

WEEKOFYEAR('2000-03-01 10:20:30') -- returns 9

 

DATEDIFF( string fecha1, string fecha2 ): devuelve el número de días entre las dos fechas.

DATEDIFF('2000-03-01', '2000-01-10') -- returns 51

 

DATE_ADD( string fecha, int dias ): suma a la fecha la cantidad indicada de días indicados.

DATE_ADD('2000-03-01', 5) -- returns '2000-03-06'

 

DATE_SUB( string fecha, int dias ): resta de la fecha la cantidad indicada de días indicados.

DATE_SUB('2000-03-01', 5) -- returns ‘2000-02-25’

 

 

Funciones de cadena


 

ASCII( string str ): convierte el primer caracter de la cadena en su valor numérico ASCII.

ASCII('hadoop') -- returns 104

ASCII('A')      -- returns 65

 

CONCAT( string str1, string str2, ... ): concatena todas las cadenas que se pasan como argumento.

CONCAT('hadoop','-','hive') -- returns 'hadoop-hive'

 

CONCAT_WS( string delimiter, string str1, string str2, … ): similar a CONCAT, pero entre las cadenas a concatenar se puede especificar el caracter que las delimitará.

CONCAT_WS('-','hadoop','hive') -- returns 'hadoop-hive'

 

FIND_IN_SET( string cadena_buscar, string lista_de_cadenas): busca la cadena cadena_buscar en lista_de_cadenas, y devuelve la posición de la primer ocurrencia. lista_de_cadenas debe estar formadas por cadenas separadas por coma.

FIND_IN_SET('ha','hao,mn,hc,ha,hef') -- returns 4

 

LENGTH( string str ): devuelve el número de caracteres de la cadena.

LENGTH('hive') -- returns 4

 

LOWER( string str ),  LCASE( string str ): convierte los caracteres de la cadena a minúsculas.

LOWER('HiVe') -- returns 'hive'

 

LPAD( string str, int n, string pad ): devuelve una cadena de n elementos, completando a la izquierda con el elementos pad hasta alcanzar la longitud indicada.

LPAD('hive',6,'v') -- returns 'vvhive'

 

LTRIM( string str ): elimina los espacios en blanco a la izquierda de la cadena.

LTRIM('   hive') -- returns 'hive'

 

REPEAT( string str, int n ): repite la cadena n veces.

REPEAT('hive',2) -- returns 'hivehive'

 

RPAD( string str, int n, string pad ): igual a LPAD, pero completando los caracteres a la derecha.

RPAD('hive',6,'v') -- returns 'hivevv'

 

REVERSE( string str ): invierte la cadena.

REVERSE('hive') -- returns 'evih'

 

RTRIM( string str ): elimina los espacios en blanco a la derecha de la cadena.

LTRIM('hive   ') -- returns 'hive'

 

SPACE( int n ): devuelve una cadena formada por n espacios en blanco.

SPACE(4) -- returns '    '

 

SPLIT( string str, string pat ): divide la cadena según el elemento pat  y devuelve un array de cadenas. Se puede especificar una expresión regular como pat.

SPLIT('hive:hadoop',':') -- returns ["hive","hadoop"]

 

SUBSTR( string str, int primer_elemento  [,int n]  ),  SUBSTRING( string str, int primer_elemento [,int n]  ): devuelve una parte de la cadena, desde primer_elemento hasta n elementos a la derecha. Si no se indica la cantidad de caracteres a tomar, se toman todos los caracteres hasta el final de la cadena.

SUBSTR('hadoop',4) -- returns 'oop'

SUBSTR('hadoop',4,2) -- returns 'oo'

 

TRIM( string str ): elimina los espacios en blanco tanto a derecha como a izquierda de la cadena.

TRIM('   hive   ') -- returns 'hive'

 

UPPER( string str ), UCASE( string str ): convierte los caracteres de la cadena a mayúscula.

UPPER('HiVe') -- returns 'HIVE'

 

 

Funciones condicionales


 

IF( condición,  bloque verdadero, bloque falso ): la sentencia IF evalúa la condición, si es verdadera devuelve el valor de bloque verdadero, caso contrario, devuelve el valor de bloque falso.

IF(1=1, 'working', 'not working') -- returns 'working'

 

COALESCE( valor1, valor2,… ): devuelve el primer valor no NULL de la lista de valores. Si todos los elementos de la lista son NULL, devuelve NULL.

COALESCE(NULL,NULL,5,NULL,4) -- returns 5

 

CASE:

CASE [ expresión ]

     WHEN condición1 THEN resultado1

     WHEN condición2 THEN resultado2

     ...

     WHEN condición_n THEN resultado_n

     ELSE resultado

END

El valor expresión es opcional y, de estar presente, se comparará en la lista de elementos condición (condición1, condición2, …, condición_n). Todos los elementos en la lista de condiciones deben ser del mismo tipo. Las condiciones serán evaluadas en el orden dado. Una vez que una condición es hallada verdadera, se ejecuta el resultado asociado a esta, y luego se sale del bloque CASE. A su vez, todos los elementos resultado deben ser del mismo tipo. En caso de que ninguna condición sea verdadera se ejecuta el bloque ELSE, el cual es opcional. Si este no se encuentra, y ninguna condición resulta verdadera, se devuelve NULL.

Ejemplo:

CASE Fruta
     WHEN 'MANZANA' THEN 'ES UNA MANZANA'
     WHEN 'NARANJA' THEN 'ES UNA NARANJA'
     ELSE 'ES OTRA FRUTA'
END

o

CASE
     WHEN Fruta = 'MANZANA' THEN 'ES UNA MANZANA'
     WHEN Fruta = 'NARANJA' THEN 'ES UNA NARANJA'
     ELSE 'ES OTRA FRUTA'
END

 

Comentarios

1 Comment

  1. Gab

    Dimensiones ciego pero no encontré una función que convierta de int a timestamp o hay que combinar funciones? Saludos

    Reply

Submit a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

This site uses Akismet to reduce spam. Learn how your comment data is processed.