[Grandes datos de Hive] Explicación detallada del uso de la tabla de particiones y la tabla de cubos de Hive

Tabla de contenido

1. El trasfondo del concepto de partición

En segundo lugar, las características de la tabla de particiones.

3. Tipo de tabla de particiones

3.1 Partición única

3.2 Partición múltiple

Cuatro, partición dinámica y partición estática

4.1 Partición estática [carga estática]

4.1.1 Demostración de funcionamiento

4.2 Particiones Múltiples

4.2.1 Demostración de funcionamiento

4.3 Carga dinámica de datos de partición

4.3.1 Carga de datos de la tabla de particiones -- partición dinámica

4.3.2 Demostración de funcionamiento

5. Mesa de cubo

5.1 Concepto de mesa de cubos

5.2 Descripción de las reglas de depósito

5.2.1 Reglas básicas de agrupamiento

5.3 Árbol de sintaxis completo del cubo

5.4 Demostración del funcionamiento de la mesa de cubos

5.4.1 Crear tabla

5.4.2 Beneficios de usar la mesa de cubos


1. El trasfondo del concepto de partición

Cuando se usa Hive para consultar una tabla, como: select * from t_user where name ='lihua', cuando Hive ejecuta este sql, generalmente escanea los datos de toda la tabla. Sabemos que la eficiencia del escaneo completo de la tabla es muy baja , especialmente Es aún menos eficiente escanear el archivo hdfs para la consulta de datos final de Hive.

De hecho, en muchos casos, los datos que se necesitan consultar en el negocio no requieren un escaneo completo de la tabla, pero se puede predecir que los datos consultados se encuentran en un área determinada.Basándose en esta premisa, Hive introduce la partición (partition )el concepto de. La ubicación del árbol sintáctico correspondiente a la creación de tablas es la siguiente:

En segundo lugar, las características de la tabla de particiones.

La tabla de particiones se refiere al espacio de partición de la partición especificada al crear la tabla.Si necesita crear una tabla particionada, debe llamar al parámetro opcional particionado por al crear la tabla;

  • Una tabla puede tener una o más particiones, y cada partición existe en forma de carpeta en el directorio de la carpeta de la tabla;

  • Los nombres de tablas y columnas no distinguen entre mayúsculas y minúsculas;

  • Existe una partición en la estructura de la tabla en forma de campo. Puede ver la existencia del campo a través del comando de tabla con formato desc, pero el campo no almacena el contenido de datos real, sino solo la representación de la partición;

3. Tipo de tabla de particiones

Las tablas de partición se dividen en tablas de una sola partición y tablas de varias particiones según el número de campos de partición cuando se crea la tabla, de la siguiente manera:

3.1 Partición única

Partición única significa que solo hay un directorio de carpetas de primer nivel debajo del directorio de carpetas de la tabla. Al crear una tabla, solo hay un campo en PARTICIONADO POR, de la siguiente manera, partición única según la provincia;

crear la tabla t_user_province ( 
    id int, 
    cadena de nombre, 
    int de edad 
) dividida por (cadena de provincia);

3.2 Partición múltiple

La otra es de múltiples particiones, donde aparece un modo de anidamiento de múltiples carpetas debajo de la carpeta de la tabla. Al crear una tabla, puede especificar múltiples campos de partición según las necesidades comerciales. La siguiente es una tabla de tres particiones, dividida por provincia, ciudad , y condado;

crear la tabla t_user_province_city_county ( 
    id int, 
    name string, 
    age int 
) dividida por (province string, city string,county string);

Cuatro, partición dinámica y partición estática

4.1 Partición estática [carga estática]

La partición estática se refiere al valor del atributo de la partición, que el usuario especifica manualmente al cargar los datos. La sintaxis es:

cargar los datos [locales] en la ruta de entrada 'ruta de archivo' en la tabla nombre de tabla partición (campo de partición = 'valor de partición'...);

Aviso:

El parámetro Local se utiliza para especificar si los datos que se cargarán se encuentran en el sistema de archivos local o en el sistema de archivos HDFS;

4.1.1 Demostración de funcionamiento

crear tabla de particiones

Cree una tabla de partición t_all_hero_part con rol como campo de partición;

crear la tabla t_all_hero_part( 
   id int, 
   name string, 
   hp_max int, 
   mp_max int, 
   attack_max int, 
   defence_max int, 
   attack_range string, 
   role_main string, 
   role_assist string ) dividida por ( 
cadena de 
roles) 
campos delimitados en formato de fila terminados en "\t";

Ejecute el sql anterior para crear la tabla de particiones;

Se puede ver que hay un campo de partición adicional de rol en esta tabla;

Subir datos locales al directorio del servidor

Cargue los siguientes archivos de datos de prueba locales en el directorio especificado

cargar datos en colmena

Use el siguiente comando para cargar el archivo de datos local en la tabla Hive

cargue los datos en la ruta de entrada local '/usr/local/soft/hivedata/archer.txt' en la tabla t_all_hero_part partición (role='sheshou'); 
carga los datos de la ruta de entrada local '/usr/local/soft/hivedata/assassin.txt' en la tabla t_all_hero_part partición (role='cike'); 
cargue los datos en la ruta de entrada local '/usr/local/soft/hivedata/mage.txt' en la tabla t_all_hero_part partición (role='fashi'); 
cargue los datos en la ruta de entrada local '/usr/local/soft/hivedata/support.txt' en la tabla t_all_hero_part partición (role='fuzhu'); 
carga los datos de la ruta de entrada local '/usr/local/soft/hivedata/tank.txt' en la tabla t_all_hero_part partición (role='tanke'); 
carga los datos de la ruta de entrada local '/usr/local/soft/hivedata/warrior.txt' en la tabla t_all_hero_part partición (role='zhanshi');

Proceso de implementación

Verifique los datos, puede ver que los datos se asignan correctamente a la tabla de partición, preste atención a la última columna que es el campo de partición;

Al mismo tiempo, los datos en el directorio HDFS muestran la siguiente estructura

El almacenamiento de datos de la tabla de particiones estáticas es muy regular.La capa externa usa el nombre de la partición como directorio, y la capa interna es el archivo de datos específico de la partición actual;

La diferencia entre esto y las tablas ordinarias sin particiones es clara de un vistazo, por lo que no entraré en detalles. A través de esta forma intuitiva, el concepto de tablas particionadas se puede entender mejor de la siguiente manera:

  • El concepto de creación de particiones proporciona una forma de separar los datos de la tabla de Hive en varios archivos/directorios;

  • Diferentes particiones corresponden a diferentes carpetas, y los datos de la misma partición se almacenan en la misma carpeta;

  • Al consultar y filtrar, solo necesita encontrar la carpeta correspondiente de acuerdo con el valor de la partición y escanear los archivos debajo de esta partición debajo de esta carpeta para evitar el escaneo completo de datos de la tabla;

  • Esta forma de especificar consultas de partición se denomina poda de partición;

En este momento, si usa el siguiente sql para consultar, primero puede ubicar la partición y luego solo consultar el archivo de datos debajo de esta partición, de modo que no necesite escanear toda la tabla y la eficiencia mejore considerablemente. ;

seleccione * de t_all_hero_part donde role="sheshou" y hp_max >6000;

4.2 Particiones Múltiples

Se puede encontrar en la sintaxis relevante sobre las particiones en la declaración de creación de la tabla que Hive admite varios campos de partición:

PARTICIONADO POR (partición1 tipo_datos, partición2 tipo_datos,….)

En particiones múltiples, existe una relación progresiva entre particiones, que puede entenderse como continuar dividiendo en base a la partición anterior.Desde la perspectiva de HDFS, significa continuar dividiendo subcarpetas dentro de la carpeta. Por ejemplo: divida los datos de la población nacional según la provincia primero y luego divídalos según la ciudad. Si lo necesita, incluso puede continuar dividiendo según el distrito y el condado. En este momento, es un 3- tabla de particiones

4.2.1 Demostración de funcionamiento

Crear dos tablas de partición

Crear una tabla de partición dual, dividida por provincia y ciudad

crear la tabla t_user_province_city (id int, cadena de nombre, int de edad) dividida por (cadena de provincia, cadena de ciudad);

Cree una tabla de tres particiones, dividida por provincia, ciudad y condado

crear la tabla t_user_province_city_county (id int, cadena de nombre, cadena de edad) dividida por (cadena de provincia, cadena de ciudad, cadena de condado);

4.3 Carga dinámica de datos de partición

El método anterior de especificar datos de partición manualmente mediante el método de carga también se denomina partición estática (carga estática). En el uso real, si se crean muchas particiones, significa que el comando de carga debe usarse para cargar muchas veces, por lo que la eficiencia está destinada a ser muy baja.En este momento, puede considerar usar la partición dinámica de Hive;

4.3.1 Carga de datos de la tabla de particiones -- partición dinámica

  • La llamada partición dinámica significa que el valor del campo de la partición se deduce automáticamente en función del resultado de la consulta (posición del parámetro). La sintaxis principal es insertar+seleccionar;

Para habilitar el particionamiento dinámico de Hive, se deben configurar dos parámetros en la sesión de Hive:

#Especifique el modo 
de partición 
dinámica
, que se divide en modo no estricto antiadherente y modo estricto estricto 
#el modo estricto estricto requiere al menos una partición para ser un conjunto de particiones estáticas 
hive.exec .dynamic.partition.mode=nonstrict 
;

4.3.2 Demostración de funcionamiento

Cree una nueva tabla de particiones y realice una inserción dinámica de particiones. La declaración de creación de la tabla sql es la siguiente

crear la tabla t_all_hero_part_dynamic( 
    id int, 
    name string, 
    hp_max int, 
    mp_max int, 
    attack_max int, 
    defence_max int, 
    attack_range string, 
    role_main string, 
    role_assist string 
) dividida por (cadena de roles) campos 
delimitados en formato de fila 
terminados en "\t";

Antes de ejecutar el sql anterior, debe configurar los siguientes parámetros en la sesión actual:

establecer colmena.exec.dynamic.partition=true; 
establezca hive.exec.dynamic.partition.mode=nonstrict;

Una vez completada la creación, ejecute el siguiente sql para importar los datos de la tabla anterior

inserte en la tabla t_all_hero_part_dynamic partición (rol) seleccione tmp.*,tmp.role_main de t_all_hero tmp;

Puede tomar mucho tiempo para ejecutar

 

Vea el directorio de la tabla dinámica en hdfs y podrá ver que los archivos de datos también se dividen de acuerdo con los campos de partición esperados;

Nota sobre las tablas de particiones:

  • La tabla de particiones no es una regla gramatical necesaria para crear una tabla, es una tabla de medios de optimización, opcional;

  • El campo de partición no puede ser un campo existente en la tabla y no se puede repetir;

  • El campo de partición es un campo virtual y sus datos no se almacenan en el archivo subyacente;

  • La determinación de los valores de los campos de partición proviene de la especificación manual de los datos del valor del usuario (partición estática) o la inferencia automática basada en la ubicación de los resultados de la consulta (partición dinámica);

  • Hive admite múltiples particiones, es decir, las particiones continúan sobre la base de particiones y las particiones son más detalladas;

5. Mesa de cubo

5.1 Concepto de mesa de cubos

Una tabla de cubos también se denomina tabla de cubos. El nombre proviene de la palabra cubo en la sintaxis de creación de tablas. Es un tipo de tabla diseñado para optimizar las consultas. El archivo de datos correspondiente a la tabla de cubos se descompondrá en varias partes en la parte inferior. capa. En otras palabras, se divide en varios archivos pequeños independientes. Al dividir los cubos, es necesario especificar según qué campo se dividen los datos en varios cubos (varias partes);

5.2 Descripción de las reglas de depósito

5.2.1 Reglas básicas de agrupamiento

Los datos con el mismo número de depósito se asignarán al mismo depósito;

Número de cubeta = hash_function(bucketing_column) mod num_buckets 
      número de cubeta = método hash (campo de cubeta) módulo número de cubeta

hash_function depende del tipo de bucketing_column:

  • Si es de tipo int, hash_function(int) == int;

  • Si se trata de otros tipos de datos como bigint, string o complejos, hash_function es más complicado, será un número derivado de este tipo, como el valor del código hash;

5.3 Árbol de sintaxis completo del cubo

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name 
[(col_name data_type [COMMENT col_comment], ... ] 
[COMMENT table_comment] 
[PARTITIONED BY (col_name data_type [COMENT col_comment], ...) ] 
[ACLUSTRADO POR (col_name, col_name, ...) [ORDENADO POR (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [ROW FORMAT DELIMITED 
|SERDE serde_name WITH SERDEPROPERTIES (property_name=property_value,... )] 
[ALMACENADO COMO formato_archivo] 
[UBICACIÓN ruta_hdfs] 
[TBLPROPERTIES (nombre_propiedad=valor_propiedad, ...)];

Descripción del parámetro clave del depósito:

  • CLUSTERED BY (col_name) indica qué campo se usa para dividir;

  • INTO N BUCKETS significa que está dividido en varios cubos (es decir, varias partes);

  • Cabe señalar que los campos para la creación de depósitos deben ser campos que ya existen en la tabla;

El SQL de cubo más simple

CREATE [EXTERNAL] TABLE [db_name.]table_name 
[(col_name data_type, ...)] 
CLÚSTERADO POR (col_name) 
EN N CUBO;

5.4 Demostración del funcionamiento de la mesa de cubos

Requisitos, existen los siguientes archivos de datos,

Interpretación del contenido del archivo:

  • El contenido muestra la información acumulada de casos de la nueva corona epidemia en cada condado al 28 de enero de 2021 en Estados Unidos, incluyendo casos confirmados y defunciones;

  • Significado del campo: count_date (fecha estadística), condado (condado), estado (estado), fips (código de condado), casos (casos confirmados acumulados), muertes (casos de muerte acumulados);

5.4.1 Crear tabla

El campo de depósito debe ser un campo que ya exista en la tabla

Tabla de cubos sin clasificación de campos

De acuerdo con el campo de estado, los datos se dividen en 5 cubos y la declaración de creación de la tabla es la siguiente:

CREAR TABLA t_usa_covid19_bucket ( 
      cadena de fecha de conteo, 
      cadena de condado, 
      cadena de estado, 
      int de fips, 
      int de casos, 
      int de muertes) 
AGRUPAR POR (estado) EN 5 CUBO;

Mesa de cubos con clasificación de campo

Según el campo de estado, se divide en 5 cubos, y cada cubo se ordena en orden inverso según el número de casos confirmados.

CREAR TABLA t_usa_covid19_bucket_sort ( 
     cadena de fecha de recuento, 
     cadena de condado, 
     cadena de estado, 
     int de fips, 
     int de casos, 
     int de muertes) 
AGRUPADO POR (estado) 
ordenado por (desc de casos) EN 5 CUBO;

Después de que la creación sea exitosa, verifique hdfs y podrá ver el directorio de datos relevante de la tabla;

Nota: Al importar datos a la tabla de cubos de Hive, ya no puede usar directamente los comandos hdfs para cargar directamente los archivos de datos en el directorio de la tabla, debe usar insertar + seleccionar;

Para importar datos en la tabla de depósito creada anteriormente, primero cree una tabla ordinaria y cree la tabla sql de la siguiente manera:

CREAR TABLA t_usa_covid19 ( 
       cadena de fecha de recuento, 
       cadena de condado, 
       cadena de estado, 
       int de fips, 
       int de casos, 
       int de muertes) 
campos delimitados en formato de fila terminados en ",";

Subir archivos de datos a la tabla;

hdfs dfs -put ./us-covid19-counties.dat /user/hive/warehouse/test.db/t_usa_covid19

Después de que la ejecución sea exitosa, verifique los datos de la tabla y podrá ver que los datos se cargaron correctamente;

Use la sintaxis insert+select para cargar datos en la tabla de cubo

insertar en t_usa_covid19_bucket seleccionar * de t_usa_covid19;

Después de ver que se completó la tarea de reducción del mapa, verifique los datos de la tabla de cubos y los datos se cargarán en este momento;

Al observar la estructura de datos subyacente de t_usa_covid19_bucket en HDFS, podemos encontrar que los datos se dividen en 5 partes y, a partir de los resultados, podemos encontrar que los datos con el mismo campo de depósito deben dividirse en el mismo depósito;

A continuación, hagamos una prueba. Consulte los datos del estado de Nueva York en función del estado del campo de depósito. Dado que los datos se clasifican según el estado (estado), al consultar, ya no es necesario escanear y filtrar toda la tabla. En la capa inferior, al consultar, el número de cubo se calculará de acuerdo con la regla de cubo hash_function (Nueva York) mod 5, y los datos en el cubo especificado se pueden consultar para descubrir que el resultado es un escaneo de cubo en lugar de un completo exploración de la tabla;

seleccione * de t_usa_covid19_bucket donde estado="Nueva York";

En cuanto a la velocidad de consulta, sigue siendo muy rápida;

5.4.2 Beneficios de usar la mesa de cubos

Reduzca los escaneos de tablas completos al realizar consultas basadas en campos agrupados

Después de la agrupación, si filtra según el campo de agrupación, la cantidad de datos se reduce significativamente y puede evitar escanear toda la tabla y mejorar la eficiencia de las consultas;

JOIN puede mejorar la eficiencia de los programas de MR y reducir la cantidad de productos cartesianos

Consulta asociada normal de dos tablas, como seleccionar a.* de una unión b en a.id = b.id ... tal consulta, si no usa la tabla de cubo, los datos subyacentes deben basarse en el número de Productos cartesianos Escaneo y consulta, y para la tabla de cubo, si el campo posterior pasa a ser un campo de cubo, los datos de consulta se llevarán a cabo en un cubo determinado y la cantidad de datos se reduce, por lo que la cantidad de productos cartesianos también será muy reducido;

Muestreo eficiente de datos usando tablas agrupadas

Cuando la cantidad de datos es particularmente grande y es difícil procesar todos los datos, el muestreo se vuelve particularmente importante. El muestreo puede estimar e inferir las características del conjunto a partir de los datos muestreados, y es un método de trabajo e investigación económico y efectivo comúnmente utilizado en experimentos científicos, inspecciones de calidad y encuestas sociales.

Supongo que te gusta

Origin blog.csdn.net/congge_study/article/details/128888831
Recomendado
Clasificación