Cuando realizamos una importación desde un sistema RDBMS a Hadoop se realiza una generación de código, Sqoop crea una instancia de Java con la definición de los registros que se van a importar. Pero se puede dar el caso que queramos generar de forma independiente dicha instancia de Java, para ello utilizamos la herramienta codegen de Sqoop.Codegen es una herramienta de Sqoop que realiza la generación de código, genera clases de Java las cuales interpreta y encapsula los datos importados, pero no realiza una importación de los datos. Sqoop examina la tabla de la base de datos origen para determinar los tipos de datos adecuados. Esta generación de código es útil en el caso que perdamos por algún motivo la instancia de Java creada durante la importación, cambie la especificación de los registros de la tabla origen o bien porque usemos un delimitador de campo diferente, para estos casos, nos interesará realizar la generación de código.

La clase generada es capaz de manejar un único registro de la tabla que se ha importado. Se puede manipular dicho registro en un programa de MapReduce o almacenarlo en un archivo SequenceFile en HDFS. Si estamos trabajando con archivos del tipo SequenceFiles, necesitaremos obligatoriamente generar clases con el fin de deserializar los datos, o bien, podemos trabajar con filas que han sido importadas a texto plano, en ese caso no es necesario la generación de código.

¿Cómo funciona?

Sqoop utiliza el conector JDBC para examinar la tabla que va a importar. Recupera una lista de todas las columnas y sus tipos de datos en SQL. Estos tipos en SQL (varchar, integer, etc) se mapean a un tipo de datos de Java (string, integer, etc); estas variables creadas en Java serán manejadas por las aplicaciones de MapReduce. Por tanto, con esta información, Sqoop generará una clase basada en la especificación de tabla que se vaya a importar (o para la que se va a generar el código) para manejar los registros de dicha tabla.

En este ejemplo, tenemos una base de datos de ejemplo llamada HadoopDB que tiene una tabla clientes en SQL Server, la cual utilizamos en el post Exportar datos a SQL Server desde Hadoop. La tabla clientes tiene 6 campos, ClientesID, Nombre, Apellido, Email, País y Teléfono. Vamos a ver cómo generar código para dicha tabla. Abrimos la consola de comandos de Hadoop y escribimos la siguiente sentencia (Recordad, sustituir SERVERNAME por el nombre de vuestro servidor e INSTANCENAME por el nombre de vuestra instancia de SQL Server):

sqoop-codegen --connect "jdbc:sqlserver://SERVERNAMEINSTANCENAME:1433;database=HadoopDB;integratedSecurity=true" --table "Clientes" --class-name "Clientes"

–class-name: indica el nombre de la clase java que se generará.

Esto generará una clase Java llamada Clientes.java en el directorio donde tengamos instalado Sqoop, en este caso en C:Hadoopsqoop-1.4.4bin

Abrid la clase Clientes.java con un editor de texto y explorad el contenido de la clase. Contiene métodos para la consulta y modificación de los registros de la tabla, por ejemplo, para el campo Nombre los siguientes métodos:

public String get_Nombre()
 public void set_Nombre(String Nombre)
 public Clientes with_Nombre(String Nombre)

Se generarán los mimos métodos de forma trivial para los campos: ClientesID, Apellido, Email, Pais y Telefono.

public void readFields(ResultSet __dbResults) throws SQLException
public void write(PreparedStatement __dbStmt) throws SQLException

Los métodos de serialización, de la interfaz DBWritable, permiten que clase Clientes.java interactuar con el conector JDBC.  La interfaz ResultSet de JDBC proporciona un cursor que recupera los registros de una consulta. El método ReadFields rellenará los campos del objeto Clientes con las columnas de una fila del resultado de la consulta. El método Write permite Sqoop insertar nuevas filas Clientes en una tabla.

 

Post anteriores relacionados con Sqoop: