GuilleSQL :: Microsoft SQL Server, SSIS, y más !!

Introducción a Hive en Azure HDInsight


Hive proporciona un lenguaje con una sintaxis similar a SQL (HiveQL), que permite leer, escribir, y gestionar grandes DataSets. De este modo, podemos leer el contenido de una carpeta como si fuera una tabla, utilizando una sintaxis similar a SQL. Estas consultas son convertidas a trabajos (Jobs) que tienen asociadas operaciones Map and Reduce (habitualmente utilizando el motor Tez, en lugar del motor MapReduce). Hive lo tenemos disponible en Azure al montar un Cluster de Hadoop con HDInsight (que es Hortonworks). Una vez desplegado HDInsight, podremos consumir Hive desde la Hive Shell en una sesión SSH, la consola web para ejecutar consultas HiveQL (HUE), Visual Studio con Azure SDK, PowerShell, ODBC para Hive, etc.

Crear y Cargar Tablas en Hive

Para crear una tabla en Hive utilizaremos el comando CREATE TABLE de HiveQL. Este comando simplemente nos va a permitir definir un esquema de metadatos sobre una carpeta, que se utilizará cuando consultemos la tabla (y no en el momento de su creación, por lo que la carpeta puede estar vacía o no cumplir dicho esquema en el momento de la creación).

Al crear la tabla deberemos especificar el formato de fichero y la localización de la carpeta donde se ubicará el fichero o ficheros que deseamos leer. Por defecto, se utilizará como localización la ruta <database>/<table_name>.

En este sentido, hay que tener en cuenta que la base de datos por defecto de Hive se llama default, y su localización por defecto en HDInsight es /hive/warehouse (que podremos encontrar dentro del almacenamiento compartido de nuestro Cluster de HDInsight). Así por ejemplo, si creamos una nueva tabla llamada mytable en la base de datos por defecto, referenciará a la carpeta /hive/warehouse/mytable.

Podemos diferenciar dos tipos de tablas en Hive, en función de cómo gestionan el tiempo de vida de la carpeta subyacente en relación con el tiempo de vida de la tabla.

  • Internal. Son las más comunes y la opción por defecto. Al eliminar la tabla, se elimina también la carpeta subyacente (y todos los ficheros en su interior), indiferentemente de si la carpeta existía o no antes de la creación de la tabla.
  • External. Se gestiona de forma independiente a la carpeta subyacente. Por lo tanto, al eliminar la tabla no se eliminará la carpeta subyacente.

Del mismo modo, tenemos disponibles diferentes tipos de datos al crear una nueva tabla en Hive, principalmente:

  • Enteros: TINYINT, SMALLINT, INT, BIGINT
  • Decimales: FLOAT, DOUBLE, DECIMAL
  • Caracteres: STRING, VARCHAR, CHAR
  • Día/Hora: TIMESTAMP, DATE
  • Otros: BOOLEAN, BINARY, ARRAY, MAP, STRUCT, UNIONTYPE

A continuación se muestra un ejemplo de creación de una Tabla de tipo Internal en Hive sobre la base de datos por defecto, por lo que utilizará la carpeta /hive/warehouse/mytable1, y al borrar la tabla se borrará la carpeta y los ficheros en su interior:

CREATE TABLE guillesql_tbl
(
col1 STRING,
col2 INT
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ';

En el anterior caso definido dos columnas. Los valores que falten se devolverán como NULL. Igualmente, los valores que no cumplan con el tipo de dato que les corresponda también se devolverán como NULL (ej: si en la columna col2 nos encontramos una cadena, se devolverá como NULL). 

Podríamos cargar una Tabla de Hive directamente con el comando LOAD DATA, que por debajo lo que va  a hacer es mover los ficheros de una carpeta a otra.

LOAD DATA [LOCAL] INPATH '/data/source_file.txt' INTO TABLE guillesql_tbl;

También podríamos hacer un INSERT sobre una tabla desde los datos leídos de otra tabla, como se muestra en el siguiente ejemplo:

INSERT INTO TABLE guillesql_fact
SELECT Col1, UPPER(Col2)
FROM guillesql_tbl;

En el siguiente ejemplo vemos como Hive ejecuta dicha consulta, transformándola a un trabajo de Map and Reduce utilizando el motor de Tez.

O incluso podríamos crear una Tabla desde una SELECT, ejecutando una sentencia del tipo CREATE TABLE AS SELECT (CTAS), de forma similar a como se muestra en el siguiente ejemplo:

CREATE TABLE guillesql_fact
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE LOCATION '/data/guillesql_fact'
AS
SELECT Col1, SUM(Col2) AS Total
FROM guillesql_tbl
GROUP BY Col1;

También es posible crear bases de datos, utilizando el comando CREATE DATABASE, aunque no es algo muy utilizado (la mayoría de la gente trabaja con la base de datos por defecto).

Consultando Tablas Hive

Una vez que hemos creado una tabla en Hive, podemos consultarla utilizando HiveQL, de una forma muy parecida a como lo haríamos con T-SQL. Un ejemplo de consulta SQL sería la siguiente:

SELECT Empleado, SUM(Salario) AS TotalSalario
FROM Nominas
WHERE Col3 = 'ABC' AND Categoria < 10
GROUP BY Empleado
ORDER BY Categoria;

Tenemos multitudes de funciones que podemos utilizar en nuestras consultas HiveSQL. En el siguiente ejemplo, se realiza un casting de DATETIME a DATE.

SELECT CAST(SUBSTR(datetime, 1, 10) AS DATE) AS event_date, level, event_id
FROM guillesql_tbl;

Igualmente, también podemos crear Vistas en Hive, de tal modo que podamos asignar un nombre a una consulta para facilitar su utilización, de forma similar a como haríamos en T-SQL. Un ejemplo podría ser el siguiente:

CREATE VIEW vSumNominas
AS
SELECT Empleado, SUM(Salario) AS TotalSalario
FROM Nominas
GROUP BY Empleado;

Particionamiento de Tablas en Hive

El Particionamiento de Tablas en Hive permite mejorar el rendimiento de su consulta a través de un almacenamiento en múltiples localizaciones (ficheros y/o carpetas). De este modo, al ejecutar las consultas HiveQL, se pueden pre-filtrar los datos limitando el número de ficheros (datos) a leer.

En el siguiente ejemplo se crea una Tabla Particionada en Hive que contiene dos columnas más la clave de particionamiento (se podría particionar por múltiples columnas).

CREATE TABLE part_guillesql_fact
(
col1 INT,
col2 STRING
)
PARTITIONED BY (col3 STRING);

Así, en este caso, para cargar datos en esta tabla particionada de ejemplo, podríamos utilizar una sintaxis como la siguiente, que implicaría cargar una partición cada vez. Al hacer esto, se crearía una carpeta por debajo de la tabla Hive, que contendría ficheros que almacenarían sólo las dos primeras columnas.

INSERT INTO TABLE part_guillesql_fact PARTITION(col3='A')
SELECT col1, col2
FROM stg_table
WHERE col3 = 'A';

Si quisiéramos poder cargar a la vez (en una misma sentencia INSERT) un conjunto de filas con distintos valores para la columna por la que está particionada la tabla, podríamos hacerlo, pero necesitaríamos establecer un par de opciones de configuración primero:

SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode = nonstrict;

INSERT INTO TABLE part_guillesql_fact PARTITION(col3)
SELECT col1, col2, col3
FROM stg_guillesql_tbl; 

La siguiente imagen del curso de EDX DAT202.1x - Processing Big Data with Hadoop in Azure HDInsight, resume todo esto de forma gráfica:

Tablas Sesgadas (Skewed Tables)

Una alternativa a las Tablas Particionadas de Hive, son las Tablas Sesgadas (Skewed Tables). En el siguiente ejemplo, se crea una tabla formada por tres columnas, de tal modo que todas las filas para las que la columna col3 tenga el valor ‘A’ se almacenarán en un fichero, y el resto de filas en otro fichero diferente.

CREATE TABLE skewed_guillesql_tbl
(
col1 INT,
col2 STRING,
col3 STRING
) SKEWED BY (col3) ON ('A') [STORED AS DIRECTORIES];

Tablas Agrupadas (Clustered Table)

Otra alternativa que tendríamos a las Tablas Particionadas de Hive, son las Tablas Agrupadas (Clustered Tables). En este caso, se aplica una función hash sobre una columna para dividir las filas entre un número determinado de ficheros, resultando especialmente útil cuando necesitamos hacer un Join entre múltiples tablas. En el siguiente caso de ejemplo, se divide la tabla en 3 ficheros (buckets), según el valor de la columna col3.

CREATE TABLE clust_guillesql_tbl
(
col1 INT,
col2 STRING,
col3 STRING
) CLUSTERED BY (col3) INTO 3 BUCKETS;

Funciones Definidas por el Usuario (UDF) en Python

Hive permite intercambiar información con Python a través de una técnica denominada streaming, que consiste en pasar filas desde Hive a través de la interfaz de entrada standard (STDIN) que es utilizada por Python como un stream de texto. Una vez aquí, en Python podremos procesar la información que hemos recibido en la forma que lo necesitemos para conseguir el resultado deseado, que devolveremos a Hive a través de la interfaz de salida standard (STDOUT), simplemente utilizando el comando print.

Si bien desde Python utilizaremos STDIN y STDOUT, desde Hive utilizaremos la sentencia TRANSFORM para invocar a una función definida por el usuario (UDF) en una SELECT.

Así, podríamos crear un script Python como el siguiente:

#!/usr/bin/env python
import sys
import string

while True:
   line = sys.stdin.readline()
   if not line:
      break

   row = string.strip(line, "\n")
   year, miles, vans, trucks = string.split(row, "\t")
   total_freight = float(vans) + float(trucks)
   print "\t".join([year, miles, str(total_freight)]) 

Que podríamos utilizar desde Hive utilizando la función TRANSFORM de una forma similar a la siguiente:

-- add the python file to the cached environment in all the Cluster Nodes
add file wasb:///data/total_freight.py;

-- TRANSFORM allows to transform a set of columns using an external python function
SELECT TRANSFORM (year, miles, vans, trucks)
  USING 'python total_freight.py'
  AS (year INT, miles FLOAT, total_freight FLOAT)
FROM freight; 

Hive y Visual Studio (Azure SDK)

Podemos extender Visual Studio instalando el Azure SDK, de tal modo que tendremos nuevos tipos de proyectos, add-ins, etc., relacionados con distintos productos de Azure, incluyendo HDInsight y Hive. Si no hemos instalado aún el Azure SDK, es un buen momento para hacerlo. Recordemos que tenemos disponible Visual Studio 2017 Community como descarga gratuita bajo ciertas condiciones de uso y licenciamiento.

Así, Visual Studio se integra con el Hive de HDInsight, ofreciéndonos varias ventajas. Desde el Server Explorer de Visual Studio podremos explorar diferentes tipos de recursos de Azure, entre los que se encuentra HDInsight.

Desde aquí podremos escribir consultas HiveQL, con la ventaja del intelliSense, que nos ayudará a escribir el código HiveQL de una forma más fácil y rápida, y además podremos lanzar la consulta para su ejecución, ya sea en Batch o en forma interactiva.

Desde el Server Explorer de Visual Studio también tenemos una pequeña herramienta gráfica para crear tablas de Hive, que nos puede ser de ayuda en alguna ocasión.

ODBC Driver para HDInsight Hive

En el caso de Microsoft Windows, podemos descargar e instalar el Driver ODBC para Hive de Microsoft, disponible en 32-bit y 64-bit (podemos instalar ambos en la misma máquina). Para Linux y macOS hay otras opciones de terceros que también funcionan correctamente sobre el Hive de HDInsight, por lo que no habría problema.

Esto nos va a permitir poder acceder a nuestras tablas de Hive desde cualquier aplicación compatible con ODBC, como Excel, Power BI, y cualquier otra, que no son pocas, convirtiendo a nuestros contenidos Hive en una solución muy accesible.

Despedida y cierre

Hasta aquí llega el presente artículo, en el que hemos querido hacer una simple introducción a Hive, dentro de la solución Hadoop de HDInsight, que actualmente es una implementación Hadoop de Hortonworks en formato PaaS de Azure, enfocado para aquellos que quieran conocer esta tecnología.

Si te ha parecido interesante este artículo, te recomiendo que eches un vistazo al curso  gratuito de EDX DAT202.1x - Processing Big Data with Hadoop in Azure HDInsight, en el que podrás encontrar contenidos y Labs prácticos, además de conocer otras tecnologías relacionadas.

Poco más por hoy. Como siempre confío que la lectura resulte de interés.

 


[Fecha del Artículo (UTC): 18/02/2018]
[Autor: GuilleSQL]



Escribir un Comentario

Para poder escribir un comentario, debe Iniciar Sesión con un usuario.

Si no dispone de un usuario, puede Registrarse y hacerse miembro.

Si dispone de un usuario, pero no recuerda sus credenciales de acceso, puede Restablecer su Contraseña.

Miembros de
Miembros de GITCA (Global IT Community Association)

Menu de Usuario
  Iniciar Sesión
  Registrarse
  Restablecer Contraseña
  Ventajas de Registrarse

Acerca de
  Contigo desde Oct 2007
  771 usuarios registrados
  86146 pageloads/mes
  Ranking Alexa 498160

Social Networks
Sigue a Portal GuilleSQL en Linkedin !!
Sigue a Portal GuilleSQL en Twitter !!



Archivo

Julio de 2018 (1)
Junio de 2018 (4)
Mayo de 2018 (5)
Abril de 2018 (3)
Marzo de 2018 (2)
Febrero de 2018 (7)
Enero de 2018 (1)
Diciembre de 2017 (15)
Noviembre de 2017 (7)
Junio de 2017 (3)
Mayo de 2017 (1)
Marzo de 2017 (3)
Enero de 2017 (4)
Junio de 2016 (1)
Mayo de 2016 (2)
Abril de 2016 (2)
Septiembre de 2015 (2)
Agosto de 2015 (2)
Junio de 2015 (10)
Mayo de 2015 (4)
Abril de 2015 (8)
Marzo de 2015 (11)
Octubre de 2014 (3)
Septiembre de 2014 (7)
Agosto de 2014 (5)
Julio de 2014 (2)
Mayo de 2014 (4)
Abril de 2014 (4)
Marzo de 2014 (4)
Febrero de 2014 (1)
Enero de 2014 (5)
Diciembre de 2013 (8)
Noviembre de 2013 (2)
Octubre de 2013 (7)
Septiembre de 2013 (6)
Agosto de 2013 (1)
Julio de 2013 (6)
Junio de 2013 (11)
Mayo de 2013 (7)
Abril de 2013 (6)
Febrero de 2013 (5)
Enero de 2013 (7)
Diciembre de 2012 (12)
Noviembre de 2012 (13)
Octubre de 2012 (5)
Septiembre de 2012 (3)
Agosto de 2012 (6)
Julio de 2012 (4)
Junio de 2012 (1)
Mayo de 2012 (2)
Abril de 2012 (7)
Marzo de 2012 (16)
Febrero de 2012 (9)
Enero de 2012 (5)
Diciembre de 2011 (10)
Noviembre de 2011 (10)
Octubre de 2011 (4)
Septiembre de 2011 (5)
Agosto de 2011 (2)
Julio de 2011 (2)
Junio de 2011 (4)
Mayo de 2011 (2)
Abril de 2011 (6)
Marzo de 2011 (4)
Febrero de 2011 (10)
Enero de 2011 (5)
Diciembre de 2010 (6)
Noviembre de 2010 (4)
Octubre de 2010 (8)
Septiembre de 2010 (4)
Agosto de 2010 (1)
Julio de 2010 (3)
Mayo de 2010 (5)
Abril de 2010 (6)
Marzo de 2010 (8)
Febrero de 2010 (3)
Enero de 2010 (1)
Diciembre de 2009 (9)
Noviembre de 2009 (14)
Octubre de 2009 (2)
Septiembre de 2009 (8)
Agosto de 2009 (2)
Julio de 2009 (10)
Junio de 2009 (9)
Mayo de 2009 (10)
Abril de 2009 (9)
Marzo de 2009 (3)
Febrero de 2009 (2)
Enero de 2009 (3)
Noviembre de 2008 (2)
Octubre de 2008 (2)
Septiembre de 2008 (2)
Agosto de 2008 (5)
Julio de 2008 (5)
Junio de 2008 (1)
Mayo de 2008 (3)
Abril de 2008 (2)
Marzo de 2008 (2)
Febrero de 2008 (2)
Enero de 2008 (5)
Noviembre de 2007 (2)
Octubre de 2007 (2)






Esta información se proporciona "como está" sin garantías de ninguna clase, y no otorga ningún derecho.
This information is provided "AS IS" with no warranties, and confers no rights.

Copyright © 2007 GuilleSQL, todos los derechos reservados.
GuilleSQL.com y GuilleSQL.net son también parte de Portal GuilleSQL.

Visitas recibidas (Page Loads) en GuilleSQL (fuente: StatCounter):

screen resolution stats
Visitas