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: