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:
¿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.
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:
1 comment
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.