Ejemplos de consultas de Hive: Ordenar por, Agrupar por y Cluster By

⚡ Resumen inteligente

Las consultas de Hive utilizan las cláusulas ORDER BY, GROUP BY, SORT BY, CLUSTER BY y DISTRIBUTE BY para ordenar, agrupar y distribuir filas entre los reductores, y cada cláusula se muestra aquí en una tabla de empleados de ejemplo.

  • 🧱 Tabla de ejemplo primero: employees_guru se crea con seis columnas y se carga desde Employees.txt antes de que se ejecute cualquier cláusula.
  • 🔢 ORDENAR POR totales: La cláusula ORDER BY envía todo el conjunto de resultados a un único reductor, lo que garantiza el orden total pero ralentiza las consultas grandes.
  • 🔤 Ordenación de cadenas: Una columna de tipo cadena, como Departamento, se devuelve en orden lexicográfico en lugar de en orden numérico.
  • 📊 AGRUPACIÓN POR recuentos: Al combinar GROUP BY con count(*) se obtiene una fila por departamento con su total de empleados.
  • 🔀 ORDENAR POR es por reductor: La función SORT BY ordena las filas dentro de cada reductor, por lo que varios reductores producen una salida parcialmente ordenada.
  • 🎯 CLUSTER BY combina: CLUSTER BY actúa como DISTRIBUTE BY más SORT BY, mientras que DISTRIBUTE BY por sí solo dirige las claves coincidentes a un reductor sin ordenar.

Consultas de Hive Ordenar por, Agrupar por, Cluster Por y distribuir por

Hive proporciona un lenguaje de consulta de tipo SQL para fines ETL sobre la base de Hadoop sistema de archivos.

El lenguaje de consulta de Hive (HiveQL) proporciona un entorno de tipo SQL en Hive para trabajar con tablas, bases de datos y consultas.

Hive asocia diferentes tipos de cláusulas para realizar distintos tipos de manipulación y consulta de datos, y proporciona conectividad JDBC para una mejor conexión con nodos fuera del entorno.

Las consultas de Hive ofrecen las siguientes características:

  • Modelado de datos, como la creación de bases de datos, tablas, etc.
  • Funcionalidades ETL como por ejemplotractransformación y carga de datos en tablas
  • Une para fusionar diferentes tablas de datos
  • Scripts personalizados específicos del usuario para facilitar el código
  • Herramienta de consulta más rápida además de Hadoop

Creando una tabla en Hive

Antes de comenzar con el tema principal de este tutorial, primero crearemos una tabla que servirá de referencia para las secciones siguientes.

En este tutorial, vamos a crear la tabla “employees_guru” con 6 columnas, como se muestra en la siguiente captura de pantalla.

Sentencia CREATE TABLE de Hive para employees_guru y el comando de carga

De la captura de pantalla anterior,

  1. Estamos creando la tabla “employees_guru” con 6 columnas que contienen valores como Id, Nombre, Edad, Dirección, Salario y Departamento, que pertenecen a los empleados presentes en la organización “guru”.
  2. En este paso, cargaremos datos en la tabla employees_guru. Los datos que vamos a cargar se encuentran en el archivo Employees.txt.

Ordenar por consulta

La sintaxis ORDER BY en HiveQL es similar a la sintaxis de ORDER BY en el SQL idioma.

ORDER BY es la cláusula que usamos con la instrucción “SELECT” en consultas de colmena Para ordenar los datos, utiliza columnas de las tablas de Hive para ordenar los valores de columna específicos mencionados con ORDER BY, y la consulta muestra los resultados en orden ascendente o descendente de esos valores.

Si el campo ORDER BY mencionado es una cadena de texto, el resultado se muestra en orden lexicográfico. En el backend, todo el conjunto de resultados debe pasarse a un único reductor.

Ese único reductor también hace que ORDER BY sea costoso en una tabla grande, por lo que en modo estricto (hive.mapred.mode=strict) Hive rechaza una ORDER BY que no contiene una cláusula LIMIT.

La captura de pantalla que aparece a continuación muestra la consulta ORDER BY y sus filas ordenadas.

Consulta ORDER BY en employees_guru ordenada por Departamento

En la captura de pantalla anterior, podemos observar lo siguiente:

  1. Se trata de una consulta realizada sobre la tabla “employees_guru” con la cláusula ORDER BY y Department como nombre de columna definido para ORDER BY. “Department” es una cadena de texto, por lo que muestra los resultados en orden lexicográfico.
  2. Este es el resultado real de la consulta. Los resultados se muestran según la columna Departamento, como ADMINISTRACIÓN, Finanzas, etc., en orden.

consulta:

SELECT * FROM employees_guru ORDER BY Department;

Agrupar por consulta

La cláusula GROUP BY utiliza columnas en las tablas de Hive para agruparping Los valores de columna específicos mencionados con GROUP BY, y la consulta selecciona y muestra los resultados agrupados por esos valores.

Por ejemplo, la captura de pantalla a continuación muestra el número total de empleados presentes en cada departamento. Aquí tenemos "Departamento" como valor de GROUP BY.

Consulta GROUP BY que cuenta los empleados en cada departamento.

En la captura de pantalla anterior, observaremos lo siguiente:

  1. Es la consulta que se realiza en la tabla “employees_guru” con la cláusula GROUP BY y Department como nombre de columna GROUP BY definido.
  2. El resultado que se muestra aquí es el nombre del departamento y el número de empleados en cada uno de ellos. Todos los empleados que pertenecen a un departamento específico se agrupan y se muestran, de modo que cada fila de resultados corresponde al nombre de un departamento con su número total de empleados.

consulta:

SELECT Department, count(*) FROM employees_guru GROUP BY Department;

Ordenar por

La cláusula SORT BY ordena los resultados según los nombres de las columnas de las tablas de Hive. Podemos usar DESC para ordenar en orden descendente y ASC para ordenar en orden ascendente.

La función SORT BY ordena las filas antes de enviarlas al reductor, por lo que el orden se garantiza dentro de cada reductor, en lugar de en todo el resultado. El ordenamiento siempre depende del tipo de columna.

Por ejemplo, si el tipo de columna es numérico, se ordena numéricamente, y si el tipo de columna es de cadena, se ordena lexicográficamente.

La captura de pantalla que aparece a continuación muestra la consulta SORT BY usando DESC.

Consulta ORDENAR POR en employees_guru que devuelve Id en orden descendente

De la captura de pantalla anterior podemos observar lo siguiente:

  1. Es la consulta realizada en la tabla “employees_guru” con la cláusula SORT BY y “Id” como nombre de columna SORT BY definido. Usamos la palabra clave DESC.
  2. Por lo tanto, la salida que se muestra está en orden descendente de “Id”.

consulta:

SELECT * from employees_guru SORT BY Id DESC;

Cluster By

CLUSTER BY se utiliza como alternativa tanto a las cláusulas DISTRIBUTE BY como a las cláusulas SORT BY en HiveQL.

La cláusula CLUSTER BY se utiliza en las tablas de Hive. Hive usa las columnas de CLUSTER BY para distribuir las filas entre los reductores, y las columnas de CLUSTER BY se envían a varios reductores. Además, garantiza el orden de clasificación de los valores presentes en dichos reductores.

Por ejemplo, la cláusula CLUSTER BY se menciona en el nombre de la columna Id de la tabla employees_guru. Al ejecutar esta consulta, se envían resultados a varios reductores en el backend, pero en el frontend funciona como una cláusula alternativa tanto para SORT BY como para DISTRIBUTE BY.

Este es el proceso de back-end cuando realizamos una consulta con SORT BY, GROUP BY o CLUSTER BY en el marco de MapReduce. Por lo tanto, si queremos almacenar los resultados en varios reducers, utilizamos CLUSTER BY.

La gramática CLUSTER BY solo acepta nombres de columna, por lo que no se le pueden adjuntar ASC y DESC; un resultado descendente necesita DISTRIBUTE BY con un SORT BY … DESC separado.

La captura de pantalla que aparece a continuación muestra la consulta CLUSTER BY en Id.

Consulta CLUSTER BY en la columna Id de employees_guru

De la captura de pantalla anterior obtenemos las siguientes observaciones:

  1. Es la consulta que aplica la cláusula CLUSTER BY al valor del campo Id. Aquí se realizará una ordenación según los valores de Id.
  2. Muestra los valores de Id y Nombre presentes en employees_guru en orden alfabético.

consulta:

SELECT  Id, Name from employees_guru CLUSTER BY Id;

Distribuir por

La cláusula DISTRIBUTE BY se utiliza en tablas presentes en Hive. Hive utiliza las columnas de DISTRIBUTE BY para distribuir las filas entre los reductores, de modo que todas las filas que comparten el mismo valor de columna de DISTRIBUTE BY van al mismo reductor.

  • Garantiza que cada uno de los N reductores reciba una señal sin solapamiento.ping conjunto de los valores de la columna
  • No ordena la salida de cada reductor, y no se garantiza que las filas coincidentes se coloquen una al lado de la otra.

La captura de pantalla a continuación muestra la consulta DISTRIBUTE BY en Id.

Consulta DISTRIBUTE BY en la columna Id de employees_guru

En la captura de pantalla anterior, podemos observar lo siguiente:

  1. La cláusula DISTRIBUTE BY se aplica al Id de la tabla “employees_guru”.
  2. La salida muestra el ID y el nombre. En el backend, las filas con el mismo ID van al mismo reductor.

consulta:

SELECT  Id, Name from employees_guru DISTRIBUTE BY Id;

Las cuatro cláusulas pueden resultar confusas, por lo que la siguiente tabla las compara.

Cláusula Reductores Lo que garantiza
ORDEN POR Un Pedido total en todo el resultado
ORDENAR POR Muchos Realizar el pedido únicamente dentro de cada reductor.
DISTRIBUIDO POR Muchos La misma clave llega al mismo reductor, sin ordenar.
AGRUPACIÓN POR Muchos DISTRIBUIR POR más ORDENAR POR, ascendente

Preguntas Frecuentes

Un único reductor debe ordenar cada fila, lo que puede tardar horas en una tabla grande. Límites LIMIT que funcionan. Configurar hive.mapred.mode en nonstrict elimina la restricción por completo.

Para fijar el recuento, configure mapreduce.job.reduces antes de la consulta; de lo contrario, Hive lo estima a partir del tamaño de la entrada. ORDER BY ignora esta configuración, ya que un orden total siempre se concentra en un solo reductor.

No. La cláusula solo acepta nombres de columna y siempre ordena de forma ascendente. En su lugar, escriba DISTRIBUTE BY en la columna de partición con una columna SORT BY DESC separada; las dos columnas también pueden ser diferentes.

Están emparentados, pero no son idénticos. Cubos CLUSTER BY almacena las filas de forma permanente en un número fijo de archivos, mientras que CLUSTER BY distribuye y ordena las filas solo durante la duración de una consulta.

Los asistentes de aprendizaje automático leen el plan EXPLAIN e identifican causas como una cláusula ORDER BY sin límites, un filtro de partición faltante o una clave sesgada. Confirme cada sugerencia con el tiempo de ejecución real.

Elabora bien estos patrones a partir de un breve comentario. Verifique cualquier cosa específica del motor, porque se mezcla fácilmente con Spark Sintaxis SQL o Presto que Hive rechaza, como DESC después de CLUSTER BY.

Un archivo de texto plano llamado Employees.txt contiene los valores de las seis columnas y se carga en la tabla antes de que se ejecute la primera consulta. Cualquier archivo delimitado con columnas coincidentes funciona de la misma manera.

La semántica es idéntica, ya que se trata de características del lenguaje HiveQL y no de características del motor. Solo cambia el plan físico: los motores programan las etapas de ordenación y mezcla de forma diferente, por lo que los tiempos de ejecución varían, pero los resultados no.

Resumir este post con: