En el post anterior vimos importar datos desde SQL Server a HDFS, pero otra opción interesante es importar datos directamente a Hive ejecutando directamente la sentencia CREATE TABLE. Para importar los datos a Hive, simplemente basta con añadir el argumento –hive-import al comando Sqoop.

Sqoop hará una importación normal a HDFS a un directorio temporal. Cuando la importación haya terminado exitosamente, Sqoop genera dos sentencias, una para crear la tabla (CREATE TABLE), definiendo las columnas con los tipos de datos de Hive y la otra para cargar los datos que se encuentran en el directorio temporal (LOAD DATA INPATH). Se puede especificar el directorio temporal que queramos mediante el parámetro –target-dir o –warehouse-dir. Es importante que no usemos el directorio /user/hive/warehouse como directorio temporal, ya que puede causar problemas en la carga de datos del segundo paso.

Entonces vamos a ver como podemos importar las tablas de SQL Server a tablas Hive. El argumento que necesitamos es –hive-import

Recordad, sustituir SERVERNAME por el nombre de vuestro servidor e INSTANCENAME por el nombre de vuestra instancia de SQL Server.

Importamos la tabla Region, entonces escribiriamos esta sentencia en la línea de comandos de Hadoop, en la ruta C:HadoopSqoop-1.4.4bin

sqoop import --connect "jdbc:sqlserver://SERVERNAMEINSTANCENAME:1433;database=northwind;integratedSecurity=true" --table "Region" --hive-import --target-dir /user/hadoop/hive/region

Vamos ahora a importar la tabla Contacts. Esta tabla contiene una columna “Photo” que el tipo de datos es Image.

sqoop import --connect "jdbc:sqlserver://SERVERNAMEINSTANCENAME:1433;database=northwind;integratedSecurity=true" --table "Contacts" --hive-import --target-dir "/user/hadoop/hive/contacts"

En este caso vamos a obtener un error:

image_thumb_04EAA872

¿Qué es lo que está pasando? La columna Photo como hemos dicho es de tipo Image, y este tipo de datos no está soportado por Hive. Para este caso tendemos varias opciones, podríamos importar los datos a HDFS utilizando el parámetro –as-sequencefile. Y la otra opción, ya que en este caso queremos importar los datos a Hive directamente, el tipo de datos Image en SQL Server es traducido por una cadena de caracteres hexadecimales, por lo que podríamos guardar esa cadena en un string en Hive para mantener ese dato. Para eso, vamos a utilizar el argumento –map-column-hive. Entonces la sentencia quedaría:

sqoop import --connect "jdbc:sqlserver://SERVERNAMEINSTANCENAME:1433;database=northwind;integratedSecurity=true" --table "Contacts" --hive-import --target-dir "/user/hadoop/hive/contacts" --map-column-hive "Photo=STRING"

Si abrimos la consola de Hive, y hacemos la siguiente sentencia:

SELECT * FROM contacts WHERE Photo=129;

Veremos todos los campos para esa fila, donde la columna Photo contiene el hexadecimal como un String.

image_thumb_1_04EAA872

Como veis el proceso de importación es muy similar a HDFS, y podemos utilizar los parámetro –where para seleccionar solo aquellas filas que queramos importar, –import-all-tables para importar todas las tablas, o realizar una importación incremental, del mismo modo que vimos en el post de Importación desde SQL Server a HDFS.

 

Post anteriores relacionados con Sqoop: