Sqoop nos ofrece la posibilidad de fusionar dos conjuntos de datos o datasets en un único dataset. Supongamos que realizamos una importación desde SQL Server a HDFS, esta importación se guardará en un directorio en HDFS, y luego realizamos una carga incremental sobre la misma tabla, la carga incremental la deberemos guardar en un directorio distinto ya que sino sobrescribiremos los datos importados anteriormente. Bien, entonces tenemos dos directorios en HDFS con los datos de la tabla, es en este escenario es cuando resulta de especial interés la utilización de la herramienta Sqoop merge, para poder fusionar los datos de los directorios HDFS en uno sólo.Las opciones de la herramienta Sqoop merge son las siguientes:–class-file: especifica el nombre de la clase con la definición de las filas que se usará para realizar la fusión

–jar-file:  especifica el nombre del jar que contiene la definición de la clases

–merge-key: nombre de la columna por la cual se hará la fusión (normalmente la clave primaria)

–new-data: especifica la ruta los datos más recientes que se han importado

–onto: especifica la ruta a los datos más antiguos que se han importado

–target-dir: especifica el directorio donde se realizará la fusión.

 

Para ver el ejemplo, partimos de la premisa que hemos realizado una importación desde SQL Server a HDFS de una tabla llamada “Orders” (leer más información sobre Importación de datos desde SQL Server a HDFS),  posteriormente se han insertado nuevas filas en el origen, y realizamos nuevamente una importación pero esta vez incremental para obtener las filas nuevas insertadas en el origen. Tendremos dos directorios:

/user/hadoop/sqoop/orders : directorio en HDFS con el contenido de la tabla importada

/user/hadoop/sqoop/ordersincremental : directorio en HDFS con las nuevas filas importadas

Ahora utilizamos la herramienta Sqoop merge para fusionar ambos datasets. La sentencia sería la siguiente:

sqoop merge --new-data /user/hadoop/sqoop/ordersincremental --onto /user/hadoop/sqoop/orders --merge-key OrderID --target-dir /user/hadoop/sqoop/ordersmerge --jar-file tmpsqoop-Administratorcompileac68dd63ba1b24e832d77ce1654c30eOrders.jar --class-name Orders

 

Una aclaración sobre los parámetros –jar-file y –class-name. Cuando se realiza una importación se crea un archivo jar que contiene la definición de las columnas y sus tipos de datos, dicho jar puede contener una o más clases pertenecientes a las tablas importadas. Este archivo jar se genera mediante el conector JDBC entre SQL Server y Hadoop, pero en este caso en la herramienta Sqoop merge no se requiere el parámetro de la conexión a SQL Server (o a otro origen RDBMS), por lo tanto debemos especificar la ruta del archivo jar para poder obtener la especificación de la tabla. Esta ruta se consigue de dos formas, bien en la salida de la última importación que se ha realizado, es decir, la carga incremental, o bien podemos generar el jar manualmente mediante la herramienta Sqoop codegen.

En la siguiente imagen podéis ver cómo obtener la ruta, cuando se ha realizado la importación incremental:

image_thumb_67241203

O bien podéis generar el jar mediante la herramienta codegen, la instrucción sería la siguiente (Sustituid SERVERNAME por el nombre del servidor e INSTANCENAME por el nombre de vuestra instancia de SQL Server):

sqoop codegen --connect "jdbc:sqlserver://SERVERNAMEINSTANCENAME:1433;database=northwind;integratedSecurity=true" --table "Orders"

La salida sería la siguiente donde podréis obtener también el jar.

image_thumb_1_52328F90

Tened en cuenta que se trata de directorios temporales, por lo que cada vez que se ha realiza una importación este directorio se sobrescribe.

 

0 Shares:
Deja una respuesta

Tu dirección de correo electrónico no será publicada.

You May Also Like