Partición y agrupamiento de colmenas

Partición y agrupamiento de colmenas

Partición de colmena

El formato estándar del código de partición:
defina la partición al crear la tabla ( use PARTITIONED BY para definir la partición )

CREATE TABLE employee_partitioned(
    name string,
    work_place ARRAY<string>,
    sex_age STRUCT<sex:string,age:int>,
    skills_score MAP<string,int>,
    depart_title MAP<STRING,ARRAY<STRING>> )
PARTITIONED BY (year INT, month INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':';

El papel de las particiones

Se utiliza principalmente para mejorar el rendimiento
. El valor de las divisiones de columna de partición de la mesa en segmentos (carpetas)
. La columna "partición" es similar a la columna regular
cuando se consulta. Colmena filtra automáticamente las particiones que
se no se utilizan para mejorar el rendimiento. Se se divide en particiones estáticas y particiones dinámicas.

Partición estática

Agregue particiones estáticas con ALTER TABLE,
ADD para agregar particiones, DROP para eliminar particiones

ALTER TABLE employee_partitioned ADD 
PARTITION (year=2019,month=3) PARTITION (year=2019,month=4); 
ALTER TABLE employee_partitioned DROP PARTITION (year=2019, month=4);

Partición dinámica

Para usar la partición dinámica, primero debe configurar los atributos

set hive.exec.dynamic.partition=true;              --允许动态分区
set hive.exec.dynamic.partition.mode=nonstrict;     --关闭严格模式
set hive.mapred.mode=nonstrict;                    --关闭mapreduce的严格模式
set yarn.scheduler.minimum-allocation-mb=1024      --虚拟内存值,可以根据实际情况调整
set hive.exec.max.dynamic.partitions.pernode=20000;  -- 允许的最大分区数,默认是100

Agregar partición dinámica en modo de inserción

insert into table employee_partitioned partition(year, month)
select name,array('Toronto') as work_place,
named_struct("sex","male","age",30) as sex_age,
map("python",90) as skills_score,
map("r&d", array('developer')) as depart_title,
year(start_date) as year,month(start_date) as month
from employee_hr eh ;	

Agrupamiento de colmenas

El papel del agrupamiento

Mayor eficiencia en el procesamiento de consultas

Hacer el muestreo más eficiente

Divida los datos en depósitos según la función hash de la "columna del depósito".

Solo agrupamiento dinámico

Definición de agrupamiento

La columna de depósitos es una columna existente en la tabla. El número de
depósitos es preferiblemente 2 elevado a n. Debes
usar INSERT para cargar datos.

CLUSTERED BY (employee_id) INTO 2 BUCKETS

Muestreo de cubos

El muestreo aleatorio se puede realizar en función de la fila completa de datos

SELECT * FROM table_name TABLESAMPLE(BUCKET 3 OUT OF 32 ON rand()) s;  
 --抽取32份中的第3份桶的随机数据

El muestreo aleatorio se puede realizar en función de la columna especificada (el uso de columnas agrupadas es más eficiente)

SELECT * FROM table_name TABLESAMPLE(BUCKET 3 OUT OF 32 ON id) s;
--抽取32份中第3份桶的桶分列id 的数据

El muestreo aleatorio también se puede basar en el tamaño del bloque

SELECT * FROM table_name TABLESAMPLE(10 PERCENT) s;   --抽取10%的数据进行展示
SELECT * FROM table_name TABLESAMPLE(1M) s;           --抽取1M大小的文件内容进行展示
SELECT * FROM table_name TABLESAMPLE(10 rows) s;      --抽取前10行数据进行展示

para resumir

Dividir

Las particiones de Hive se implementan mediante la función de subdirectorio de HDFS. Cada subdirectorio contiene el nombre de la columna y el valor de cada columna correspondiente a la partición. Sin embargo, debido a que HDFS no admite una gran cantidad de subdirectorios, esto también limita el uso de particiones. Es necesario que estimemos el número de particiones en la tabla para evitar una serie de problemas provocados por el número excesivo de particiones.
Las consultas de Hive suelen utilizar columnas particionadas como condiciones de consulta. De esta manera, puede especificar que la tarea MapReduce complete el escaneo en el subdirectorio especificado de HDFS. La estructura del directorio de archivos de HDFS se puede utilizar con la misma eficacia que un índice.

Agrupamiento

El agrupamiento consiste en especificar una columna de la tabla de agrupamiento, de modo que los datos de la columna se distribuyan de forma aleatoria y uniforme en cada archivo de depósito de acuerdo con el método del módulo hash. Debido a que la operación de agrupamiento necesita realizar la operación de módulo hash en función de los datos específicos de una determinada columna, la columna de agrupamiento especificada debe basarse en una determinada columna (campo) de la tabla. El agrupamiento cambia la forma en que se almacenan los datos. Coloca filas de datos con el mismo módulo hash o en un intervalo determinado en el mismo archivo de depósito. De esta forma, se puede mejorar la eficiencia de las consultas. Si necesitamos realizar una operación JOIN en dos tablas que se han agrupado en la misma columna, solo necesitamos realizar la operación JOIN en la pasada que guarda el mismo valor de columna.

Hay un punto más: los datos en hive se almacenan en hdfs. Sabemos que los datos en hdfs no se pueden modificar y solo se pueden agregar. Luego, al ejecutar el comando de modificación de datos en hive, solo se pueden encontrar primero Archivo correspondiente, ejecute la operación de modificación después de leer y luego escriba un nuevo archivo. Si el archivo es relativamente grande, se requieren muchas lecturas y escrituras de E / S. En Hive, se adopta una estrategia de agrupamiento: solo es necesario encontrar el depósito correspondiente donde se almacena el archivo, luego leerlo y luego modificarlo y escribirlo.

Ejemplo de tabla de instrucción de muestreo (depósito x de y)

tablesample es una declaración de muestreo

tablesample(bucket x out of y)

y debe ser un múltiplo o un factor del número total de depósitos en la tabla. Hive decide la proporción de muestreo de acuerdo con el tamaño de y.

Por ejemplo: la tabla está dividida en 64 partes en total. Cuando y = 32, extraiga los datos de 2 (64/32) cubos, y cuando y = 128, extraiga los datos de 1/2 (64/128) cubos. x representa el cubo desde el que comenzar la extracción.

Por ejemplo: el número total de depósitos en la tabla es 32, y tablesample (depósito 3 de 16) significa que se extraen los datos de un total de 2 (32/16) depósitos, que son los datos del tercer depósito y el decimonoveno cubo (3 + 16) respectivamente.

Eso es todo por compartir hoy, ¡gracias!

Supongo que te gusta

Origin blog.csdn.net/giantleech/article/details/115330440
Recomendado
Clasificación