Introducción a Map Join in Hive
Map join es una característica utilizada en las consultas de Hive para aumentar su eficiencia en términos de velocidad. Unir es una condición utilizada para combinar los datos de 2 tablas. Entonces, cuando realizamos una unión normal, el trabajo se envía a una tarea Map-Reduce que divide la tarea principal en 2 etapas: "Etapa de mapa" y "Etapa de reducción". La etapa Map interpreta los datos de entrada y devuelve la salida a la etapa de reducción en forma de pares clave-valor. A continuación, pasa por la etapa de barajado donde se ordenan y combinan. El reductor toma este valor ordenado y completa el trabajo de unión.
Se puede cargar una tabla en la memoria completamente dentro de un mapeador y sin tener que usar el proceso Map / Reducer. Lee los datos de la tabla más pequeña y los almacena en una tabla hash en memoria y luego los serializa en un archivo de memoria hash, lo que reduce sustancialmente el tiempo. También se conoce como Map Side Join in Hive. Básicamente, implica realizar uniones entre 2 tablas usando solo la fase de Mapa y omitiendo la fase de Reducción. Se puede observar una disminución de tiempo en el cálculo de sus consultas si utilizan regularmente uniones de tabla pequeña.
Sintaxis para Map Join en Hive
Si queremos realizar una consulta de unión usando map-join, entonces tenemos que especificar una palabra clave "/ * + MAPJOIN (b) * /" en la declaración de la siguiente manera:
>SELECT /*+ MAPJOIN(c) */ * FROM tablename1 t1 JOIN tablename2 t2 ON (t1.emp_id = t2.emp_id);
Para este ejemplo, necesitamos crear 2 tablas con los nombres tablename1 y tablename2 que tengan 2 columnas: emp_id y emp_name. Uno debería ser un archivo más grande y uno más pequeño.
Antes de ejecutar la consulta, debemos establecer la siguiente propiedad en true:
hive.auto.convert.join=true
La consulta de unión para la unión de mapa se escribe como anteriormente y el resultado que obtenemos es:
La consulta se completó en 1.351 segundos.
Ejemplos de unir mapa en colmena
Aquí están los siguientes ejemplos mencionados a continuación
1. Ejemplo de unión de mapa
Para este ejemplo, creemos 2 tablas llamadas table1 y table2 con 100 y 200 registros respectivamente. Puede consultar el siguiente comando y capturas de pantalla para ejecutar el mismo:
>CREATE TABLE IF NOT EXISTS table1 ( emp_id int, emp_name String, email_id String, gender String, ip_address String) row format delimited fields terminated BY ', ' tblproperties("skip.header.line.count"="1");
>CREATE TABLE IF NOT EXISTS table2 ( emp_id int, emp_name String) row format delimited fields terminated BY ', ' tblproperties("skip.header.line.count"="1");
Ahora cargamos los registros en ambas tablas usando los siguientes comandos:
>load data local inpath '/relativePath/data1.csv' into table table1;
>load data local inpath '/relativePath/data2.csv' into table table2;
Realicemos una consulta normal de unión de mapa en sus ID como se muestra a continuación y verifiquemos el tiempo necesario para la misma:
>SELECT /*+ MAPJOIN(table2) */ table1.emp_name, table1.emp_id, table2.emp_id FROM table1 JOIN table2 ON table1.emp_name = table2.emp_name;
Como podemos ver, una consulta de unión de mapa normal tomó 12.521 segundos.
2. Ejemplo de unión de mapa de cubos
Ahora usemos la unión de Bucket-map para ejecutar lo mismo. Hay algunas restricciones que deben seguirse para el bucketing:
- Los cubos se pueden unir entre sí solo si el total de cubos de una tabla es múltiplo del número de cubos de la otra tabla.
- Debe tener tablas agrupadas para realizar el almacenamiento. Por lo tanto, creemos lo mismo.
Los siguientes son los comandos que se utilizan para crear tablas en tabla tabla1 y tabla2:
>>CREATE TABLE IF NOT EXISTS table1_buk (emp_id int, emp_name String, email_id String, gender String, ip_address String) clustered by(emp_name) into 4 buckets row format delimited fields terminated BY ', ';
>CREATE TABLE IF NOT EXISTS table2_buk ( emp_id int, emp_name String) clustered by(emp_name) into 8 buckets row format delimited fields terminated BY ', ' ;
También insertaremos los mismos registros de la tabla 1 en estas tablas agrupadas:
>insert into table1_buk select * from table1;
>insert into table2_buk select * from table2;
Ahora que tenemos nuestras 2 tablas agrupadas, realicemos una combinación de mapa de cubeta en estas. La primera tabla tiene 4 cubos, mientras que la segunda tabla tiene 8 cubos creados en la misma columna.
Para que la consulta de unión de mapa de cubetas funcione, debemos establecer la propiedad siguiente en true en la colmena:
set hive.optimize.bucketmapjoin = true
>SELECT /*+ MAPJOIN(table2_buk) */ table1_buk.emp_name, table1_buk.emp_id, table2_buk.emp_id FROM table1_buk JOIN table2_buk ON table1_buk.emp_name = table2_buk.emp_name ;
Como podemos ver, la consulta se completó en 8.735 segundos, que es más rápido que una unión de mapa normal.
3. Ejemplo de combinación de combinación de mapa de cubeta de fusión (SMB)
SMB se puede realizar en tablas agrupadas que tienen el mismo número de categorías y si las tablas deben clasificarse y agruparse en columnas de unión. El nivel del asignador se une a estos depósitos correspondientemente.
Al igual que en la combinación de mapa de cubos, hay 4 cubos para la tabla 1 y 8 cubos para la tabla 2. Para este ejemplo, crearemos otra tabla con 4 cubos.
Para ejecutar la consulta SMB, debemos establecer las siguientes propiedades de la sección como se muestra a continuación:
Hive.input.format = org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
hive.optimize.bucketmapjoin = true;
hive.optimize.bucketmapjoin.sortedmerge = true;
Para realizar la unión SMB, debe haber datos ordenados según las columnas de unión. Por lo tanto, sobrescribimos los datos en la tabla 1 agrupados de la siguiente manera:
>insert overwrite table table1_buk select * from table1 sort by emp_name;
Los datos se ordenan ahora, lo que se puede ver en la siguiente captura de pantalla:
También sobrescribiremos los datos en la tabla2 en bucketed de la siguiente manera:
>insert overwrite table table2_buk select * from table2 sort by emp_name;
Realicemos la unión para las 2 tablas anteriores de la siguiente manera:
>SELECT /*+ MAPJOIN(table2_buk) */ table1_buk.emp_name, table1_buk.emp_id, table2_buk.emp_id FROM table1_buk JOIN table2_buk ON table1_buk.emp_name = table2_buk.emp_name ;
Podemos ver que la consulta tomó 10.165 segundos, lo cual es nuevamente mejor que una unión de mapa normal.
Ahora creemos otra tabla para table2 con 4 cubos y los mismos datos ordenados con emp_name.
>CREATE TABLE IF NOT EXISTS table2_buk1 (emp_id int, emp_name String) clustered by(emp_name) into 4 buckets row format delimited fields terminated BY ', ' ;
>insert overwrite table table2_buk1 select * from table2 sort by emp_name;
Teniendo en cuenta que ahora tenemos ambas tablas con 4 cubos, volvamos a realizar una consulta de unión.
>SELECT /*+ MAPJOIN(table2_buk1) */table1_buk.emp_name, table1_buk.emp_id, table2_buk1.emp_id FROM table1_buk JOIN table2_buk1 ON table1_buk.emp_name = table2_buk1.emp_name ;
La consulta ha tomado 8.851 segundos nuevamente más rápido que la consulta de unión de mapa normal.
Ventajas
- Map join reduce el tiempo necesario para los procesos de clasificación y fusión que tienen lugar en el shuffle y reduce las etapas, minimizando así el costo también.
- Aumenta la eficiencia de rendimiento de la tarea.
Limitaciones
- No se puede usar la misma tabla / alias para unir diferentes columnas en la misma consulta.
- La consulta de unión de mapa no puede convertir las uniones externas completas en las uniones laterales del mapa.
- La unión de mapas solo se puede realizar cuando una de las tablas es lo suficientemente pequeña como para que pueda ajustarse a la memoria. Por lo tanto, no se puede realizar donde los datos de la tabla son enormes.
- Se puede hacer una unión izquierda a una unión de mapa solo cuando el tamaño correcto de la tabla es pequeño.
- Se puede hacer una unión derecha a una unión de mapa solo cuando el tamaño de la tabla izquierda es pequeño.
Conclusión
Hemos tratado de incluir los mejores puntos posibles de Map Join en Hive. Como hemos visto anteriormente, la unión del lado del mapa funciona mejor cuando una tabla tiene menos datos para que el trabajo se complete rápidamente. El tiempo necesario para las consultas que se muestran aquí depende del tamaño del conjunto de datos, por lo tanto, el tiempo que se muestra aquí es solo para análisis. Map join se puede implementar fácilmente en aplicaciones en tiempo real, ya que tenemos una gran cantidad de datos que ayudan a reducir el tráfico de E / S de la red.
Artículos recomendados
Esta es una guía de Map Join en Hive. Aquí discutimos los ejemplos de Map Join in Hive junto con las ventajas y limitaciones. También puede consultar el siguiente artículo para obtener más información:
- Se une en colmena
- Funciones incorporadas de la colmena
- ¿Qué es una colmena?
- Comandos de la colmena