Colección de citas famosas - Consulta de diccionarios - Únete a la guía del juego Hive

Únete a la guía del juego Hive

[Directorio]

Join Hive solo admite conexiones de igual costo, lo que significa que la condición de conexión entre tablas en Join on solo puede ser =, no

Motor de ejecución de unidades de Hive Será " traducir" HQL en una tarea de reducción de mapas. Al realizar una operación de unión de tablas, si cada tabla en varias tablas se une usando la misma columna (que aparece en la cláusula Unirse en), solo se generará un trabajo MR:

A, B Las tres tablas, C y C usan el mismo campo para la conexión, es decir, el mismo campo aparece en dos cláusulas de unión al mismo tiempo, por lo que solo se genera un trabajo MR.

Si hay varias tablas, una de las cuales está unida usando al menos 2 campos (al menos 2 de la misma tabla se enumeran en la cláusula Join), entonces se generarán al menos 2 mrjobs: p>

Las tres tablas están conectadas en función de dos campos, y estos dos campos b.key1 y b.key2 aparecen en la tabla B al mismo tiempo. El proceso de conexión es el siguiente: primero conecte las tablas A y B según a.key y b.key1, correspondientes al primer trabajo de MR; conecte los resultados de las tablas a y b, y luego conecte usando c, correspondiente al segundo MR; trabajo.

Esto se debe a que las columnas de la condición Unirse al se utilizan como claves al generar el mapa. Si la combinación tiene varias claves relacionadas, se utilizará como clave una combinación de estas claves relacionadas. Map distribuye datos al terminal Reducir según la clave y la unión específica se completa en la operación Reducir. Por lo tanto, si se unen varias tablas en función de diferentes columnas, es imposible colocar todos los datos relacionados en la misma operación Reducir en una ronda de tareas de MR.

Hive admite declaraciones de conexión SQL de uso común, como unión interna, unión externa izquierda, unión derecha y unión lateral de mapa específica de Hive. La conexión del lado del mapa es una técnica importante para optimizar las consultas de conexión de Hive.

Primero prepara tres mesas.

Empleados Tabla de empleados:

Tabla de departamentos:

Escala salarial:

Al unir varias tablas, solo los datos de todas las tablas que cumplan la condición on, que es similar a la intersección.

Se conservarán todos los registros que cumplan la condición donde en la tabla del lado izquierdo del operador de unión. Si no hay registros en la tabla del lado derecho del operador de unión que cumplan la condición de unión después de activado, las columnas seleccionadas de la tabla del lado derecho serán NULL. Sin la condición dónde, se conservarán todos los registros de la tabla de la izquierda.

El orden de ejecución de las palabras clave de consulta estándar es de -> en adelante -> donde -> agrupar por -> hay -> Ordenar por, encendido es para filtrar la tabla antes de la asociación, y la asociación por la izquierda solo es válida para la tabla derecha y se deben seleccionar todas las tablas izquierdas.

Para grandes cantidades de datos, es beneficioso utilizar condiciones donde para filtrar datos no calificados al escribir SQL. Pero para las uniones externas izquierdas y derechas, la condición donde no se ejecutará antes de que se ejecute la condición on. La condición on generará una tabla temporal y la condición donde filtrará esta tabla temporal.

Por lo tanto, para optimizar la eficiencia de la ejecución de Hive SQL, en escenarios donde se requieren uniones externas, si es una consulta condicional antes de la conexión, la consulta debe colocarse después. Al filtrar después de la conexión, la condición debe colocarse Después de dónde, la condición dónde debe usarse para filtrar la tabla principal.

Es importante tener en cuenta que si necesita filtrar la tabla principal antes de realizar una asociación izquierda con la tabla esclava, es mejor escribir la tabla principal como una subconsulta, lo que puede reducir la cantidad de datos. en la tabla principal:

A diferencia de la combinación externa izquierda, la combinación externa derecha retendrá todos los registros en la tabla en el lado derecho del operador de combinación que cumplan la condición donde. Si no hay registros en la tabla a la izquierda del operador de unión que cumplan la condición de unión después de on, la columna seleccionada de la tabla a la izquierda es NULL.

Conserve los datos de las dos tablas que cumplen la condición donde, similar a la unión, complete los campos que no cumplen la condición de unión con NULL.

La tabla anterior a la palabra clave de unión media izquierda se utiliza como tabla principal y se devuelven los registros cuyas claves en la tabla principal también están en la tabla auxiliar. En versiones anteriores de Hive, las funciones IN o EXISTS en SQL estándar no eran compatibles y se podían usar medias uniones izquierdas para lograr una funcionalidad similar.

Cabe destacar que:

El producto cartesiano es una unión que representa el número de filas de la tabla de la izquierda multiplicado por el número de filas de la tabla de la derecha.

Las conexiones en Hive se pueden dividir en conexiones ordinarias y conexiones mapeadas.

Si no se especifica Map Join o no se cumplen las condiciones para Map Join, el analizador de Hive ejecutará Common Join de forma predeterminada, es decir, la unión se completará en la etapa de reducción. Todo el proceso incluye etapas de mapeo, barajado y restauración.

Tome el siguiente HQL como ejemplo para ilustrar su proceso:

Las uniones de mapas se usan generalmente en escenarios donde una tabla muy pequeña se conecta a una tabla grande. El tamaño específico de la tabla pequeña está determinado por el parámetro colmena. mapjoin.smalltable.filesize, indica el tamaño total de la tabla pequeña. El valor predeterminado es 25 millones de bytes, que son 25 M.

Antes de Hive 0.7, necesitaba usar el mensaje de sugerencia/+mapjoin(table)/ para ejecutar Map Join; de lo contrario, se ejecutará Common Join, pero después de la versión 0.7, Map Join se convertirá automáticamente de forma predeterminada. determinado por el parámetro Hive .auto.convert.join control, el valor predeterminado es verdadero.

Como se muestra en el diagrama de flujo anterior, la tarea A se ejecuta localmente en el cliente y es responsable de escanear los datos de la pequeña tabla B, convertirlos en una estructura de datos HashTable y escribirlos en un archivo local. y luego cargar el archivo en DistributeCache.

A continuación, la Tarea B, que es un MR sin Reducir, inicia MapTasks para escanear la tabla grande A. En la etapa MAP, según cada registro de A, se asocia con la HashTable correspondiente a la tabla B. en DistributeCache, genera directamente los resultados.

Debido a que no hay Reducción en MapJoin, hay tantos archivos de resultados como tareas de Mapa, que Map genera directamente.

Map Join es más eficiente que Common Join, pero siempre habrá ocasiones en las que no se cumpla la condición de "tabla pequeña". Esto requiere una conexión de mapa de depósitos.

La unión del mapa de depósitos debe dividir las dos tablas que se van a unir en depósitos en el campo de conexión (cada depósito corresponde a un archivo en HDFS. Cuando sea necesario, el número de depósitos en la tabla pequeña es el número). de cubos en la tabla grande.

Ejemplo de creación de una tabla de depósitos:

De esta manera, la tabla my_user corresponde a 32 depósitos. Los datos se dividen según el valor hash y el uid 32, y luego se asignan. diferentes cubos.

Si dos tablas se dividen en depósitos en el campo de unión, puede realizar una unión de mapa de depósitos, específicamente:

Para dos tablas en una unión de mapa de depósitos, si cada uno Los campos de partición en cada depósito también están ordenados, por lo que también puede realizar una conexión de mapeo de depósitos de clasificación y fusión.

La declaración de construcción de la tabla es:

De esta manera, cuando dos depósitos se van a conectar localmente, solo necesita atravesar los dos depósitos en secuencia, como la operación de fusión en la operación de fusión. algoritmo de clasificación. Lee solo una parte de los datos de la tabla pequeña a la vez y luego los compara fila por fila con la tabla más grande. Este tipo de unión no limita el tamaño de la memoria y también se pueden realizar uniones externas completas.

Al realizar una conexión de mapeo de depósitos de ordenación y fusión, las propiedades que se establecerán son:

Durante el proceso de unión, una vez finalizado el mapa, los datos con la misma clave se mezclarán en el mismo En un Reducir. Si los datos se distribuyen uniformemente, la cantidad de datos procesados ​​por cada reducción suele estar equilibrada. Pero si hay un sesgo de datos obvio, la cantidad de datos procesados ​​por algunos reductores será demasiado grande, lo que hará que el tiempo de procesamiento de este nodo sea demasiado largo y se convierta en un cuello de botella.

La mesa grande está asociada a la mesa grande. Si una de las tablas está casi vacía o tiene más ceros, puede interrumpir fácilmente la reducción y hacer que se ejecute lentamente.

En este caso, puede asignar un valor aleatorio al valor atípico para distribuir la clave y distribuirla uniformemente en múltiples reducciones para ejecutar, por ejemplo:

Cuando la clave Cuando la Todos los valores son valores válidos, la solución es:

Establezca los siguientes parámetros:

Hive no puede determinar qué clave estará sesgada en tiempo de ejecución, así que use el parámetro hive.skewjoin. Tecla para controlar el umbral de pendiente.

Si se excede este valor, se enviarán nuevos valores a aquellos reductores que aún no se han alcanzado. Este valor generalmente se puede establecer en 2 a 4 veces el número de reductores para el número total de registros que se procesarán.

1.hive Foundation II (el principio y mecanismo de unión, varios tipos de unión, procesamiento simple de sesgo de datos)

2.Hive: conexión y optimización de la conexión

3. Cómo lidiar con la distorsión de datos común en Hive