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:

 

0 Shares:
1 comment
  1. Hello, Yolanda

    I´m student of strictu sensu in Brazil and I´m using haoop, mapred, sqoop and hive in my project.
    I tried to follow your posted however i didn´t get success. I tried some alternatives following guide lines over internet but no success. Could you help me?
    I try to import datas from mysql or sqlServer into hdfs and hive using
    sqoop import –connect jdbc:mysql://localhost/sakila –username root –table film –hive-import
    into hdfs ok but when starts to import into hive shows up this error:
    INFO hive.HiveImport: Exception in thread “main” java.lang.AssertionError: Unknown token: [@-1,0:0=’TOK_FILEFORMAT_GENERIC’,,0:-1]
    I know it´s something with delimited characters but i´ve already used all options and i´ve got the error.

Deja una respuesta

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

You May Also Like
Leer más

Web Scraping de páginas dinámicas con Selenium, Python y Beautifulsoup

El Web Scraping es una técnica de obtención de datos de páginas web. Existen variedad de usos; algunos de los más extendidos pueden ser el de motores de búsqueda para analizar webs y clasificarlas, o portales de compras que chequean los precios de la competencia para poder tomar decisiones basadas en esa información. Te explicamos como llevarlo a la práctica con Selenium, Python y Beautifulsoup en Azure Data.