Almacenamiento en cubos en Hive: crear una tabla en cubos en Hive
Publicado: 2021-02-17Trabajar con un gran conjunto de datos puede ser un desafío. Hay mucho de lo que hacer un seguimiento y un pequeño error puede alterar todo su flujo de trabajo. Una de las herramientas más destacadas para administrar grandes conjuntos de datos es la creación de depósitos.
Este artículo le informará sobre cómo puede realizar depósitos en Hive. Exploraremos múltiples implementaciones de esta función a través de ejemplos.
Tabla de contenido
¿Qué es el depósito en Hive?
El bucketing es una técnica de organización de datos. Si bien la partición y la creación de depósitos en Hive son conceptos bastante similares, la creación de depósitos ofrece la funcionalidad adicional de dividir grandes conjuntos de datos en conjuntos más pequeños y manejables llamados depósitos.
Con la creación de depósitos en Hive, puede descomponer un conjunto de datos de tabla en partes más pequeñas, lo que facilita su manejo. La agrupación le permite agrupar tipos de datos similares y escribirlos en un solo archivo, lo que mejora su rendimiento al unir tablas o leer datos. Esta es una de las principales razones por las que usamos el almacenamiento en cubos con particiones la mayor parte del tiempo.
¿Cuándo usamos el bucketing?
La agrupación es una funcionalidad muy útil. Si no la ha utilizado antes, debe tener en cuenta los siguientes puntos para determinar cuándo usar esta función:
- Cuando una columna tiene una cardinalidad alta, no podemos realizar particiones en ella. Un número muy alto de particiones generará demasiados archivos de Hadoop, lo que aumentaría la carga en el nodo. Eso es porque el nodo tendrá que conservar los metadatos de cada partición y eso afectaría el rendimiento de ese nodo.
- Debe usar la agrupación si sus consultas tienen varias uniones del lado del mapa. Una unión del lado del mapa es un proceso en el que se unen dos tablas usando solo la función de mapa sin usar la función de reducción.
Aspectos destacados de la acumulación en Hive
El agrupamiento se basa en la función hash, por lo que tiene los siguientes aspectos destacados:
- La función hash depende del tipo de columna de depósito que tenga.
- Debe tener en cuenta que los registros con la misma columna en el depósito se almacenarán en el mismo depósito.
- Esta función requiere que use la cláusula Clustered By para dividir una tabla en cubos.
- En el directorio de la tabla, la numeración de los cubos se basa en 1 y cada cubo es un archivo.
- El depósito es una función independiente. Esto significa que puede realizar la creación de depósitos sin realizar la partición en una tabla.
- Una tabla dividida en cubos crea secciones de archivos de datos distribuidas casi por igual.
- Tenga en cuenta que la creación de depósitos no garantiza que su tabla se llene correctamente. Por lo tanto, deberá administrar la carga de datos en los cubos usted mismo, lo que puede ser engorroso.
Leer: Colmena Vs Spark
Almacenamiento en cubos en Hive: ejemplo n.º 1
Sería mejor entender el depósito en Hive usando un ejemplo. Usaremos los siguientes datos para nuestro ejemplo:
EMPID | PRIMER NOMBRE | APELLIDO | DEPORTES | CIUDAD | PAÍS |
1001 | esmeril | Blair | Baloncesto | Qutubullapur | San Marino |
1002 | Zefr | Stephenson | Grillo | Neerharen | República Dominicana |
1003 | Otoño | Frijol | Baloncesto | Neerharen | República Dominicana |
1004 | Kasimir | Vance | Bádminton | Neerharen | República Dominicana |
1005 | Mufutau | Flores | Qutubullapur | San Marino | |
1006 | ayanna | Bancos | Fútbol | Neerharen | República Dominicana |
1007 | Selma | Bola | Tenis | Qutubullapur | San Marino |
1008 | Imbécil | Batán | Bádminton | Neerharen | República Dominicana |
1009 | imogen | Terrell | Qutubullapur | San Marino | |
1010 | Colorado | Hutchinson | Tenis | Qutubullapur | San Marino |
Nuestros datos de muestra contienen información de los empleados de un equipo deportivo. Sin embargo, algunos de los empleados no son parte de ningún equipo.
Aquí están los datos de muestra que puede copiar y pegar para seguir junto con este ejemplo:
id, Nombre, Apellido, Deportes, Ciudad, País
1001, Emerry, Blair, Baloncesto, Qutubullapur, San Marino
1002, Zephr, Stephenson, Cricket, Neerharen, República Dominicana
1003, Otoño, Frijol, Baloncesto, Neerharen, República Dominicana
1004, Kasimir, Vance, Bádminton, Neerharen, República Dominicana
1005, Mufutau, Flores, Qutubullapur, San Marino
1006, Ayanna, Banks, Fútbol, Neerharen, República Dominicana
1007,Selma,Pelota,Tenis,Qutubullapur,San Marino
1008, Berk, Fuller, Bádminton, Neerharen, República Dominicana
1009,Imogene,Terrell,,Qutubullapur,San Marino
1010,Colorado,Hutchinson,Tenis,Qutubullapur,San Marino
Ya sabemos que la agrupación nos permite agrupar conjuntos de datos en secciones más pequeñas para su optimización. Analicemos ahora cómo se completa este proceso:
Creación de la tabla base
Primero, crearemos una tabla llamada employee_base:
CREAR TABLA db_bdpbase.employee_base (
INT emplícito,
cadena de nombre,
cadena de apellidos,
cadena deportiva,
cadena de ciudades,
país STRING
)
FORMATO DE FILA DELIMITADO
CAMPOS TERMINADOS POR ','
ALMACENADO COMO ARCHIVO DE TEXTO
TBLPROPERTIES(“skip.header.line.count”=”1”);
Nuestros datos de muestra tienen un encabezado que no es necesario para el depósito, por lo que lo eliminaremos agregando la propiedad 'omitir encabezado'.
Cargar los datos en la tabla base
Usaremos la ubicación '/usr/bdp/hive/sample_data.csv' para nuestros datos de muestra y usaremos el siguiente comando para cargarlos en la tabla:
LOAD DATA INPATH '/user/bdp/hive/sample_data.csv' INTO TABLE db_bdpbase.employee_base;
Creación de la tabla en cubos
En esta sección, crearemos una tabla en cubos. Ahora podemos hacer una tabla en cubos con una partición o sin partición.
Mesa Cubeda Con Partición
En este caso, el país es la columna de partición y hemos agrupado la columna empid que ordenamos en orden ascendente:
CREAR TABLA db_bdpbase.bucketed_partition_tbl (
INT empírico,
cadena de nombre,
cadena de apellidos,
cadena deportiva,
cadena de ciudad
) PARTICIONADO POR(cadena de país)
AGRUPADO POR (empid)
ORDENADO POR (empid ASC) EN 4 CUBO;
Tabla en cubos sin partición
Alternativamente, podemos crear una tabla en cubos sin partición:
CREAR TABLA db_bdpbase.bucketed_tbl_only (
INT empírico,
cadena de nombre,
cadena de apellidos,
cadena de ciudades,
País STRING
)
AGRUPADO POR (empid)
ORDENADO POR (empid ASC) EN 4 CUBO;
Aquí, hemos agrupado la tabla en la misma columna empid.
Configuración de la propiedad
La configuración predeterminada para la creación de depósitos en Hive está deshabilitada, por lo que la habilitamos configurando su valor en verdadero. La siguiente propiedad seleccionaría el número de clústeres y reductores según la tabla:
SET hive.enforce.bucketing=TRUE; (NO es necesario EN Hive 2.x en adelante)
Carga de datos en la tabla agrupada
Hasta ahora, hemos creado dos tablas divididas en cubos y una tabla base con nuestros datos de muestra. Ahora cargaremos los datos en la tabla en cubos desde la tabla base usando el siguiente comando en la tabla en cubos con partición:
INSERTAR SOBREESCRIBIR TABLA db_bdpbase.bucketed_partition_tbl PARTICIÓN (país) SELECCIONAR * DESDE db_bdpbase.employee_base;
Para cargar datos en la tabla agrupada sin ninguna partición, usaremos el siguiente comando:
INSERTAR SOBREESCRIBIR TABLA db_bdpbase.bucketed_tbl_only SELECCIONAR * DE db_bdpbase.employee_base;
Comprobación de los datos de la tabla agrupada
Después de cargar los datos en la tabla agrupada, comprobaremos cómo se almacenan en el HDFS. Usaremos el siguiente código para verificar la tabla agrupada con partición:
hadoop fs -ls hdfs://sandbox.hortonworks.com:8020/apps/hive/warehouse/db_bdpbase.db/bucketed_partition_tbl
Almacenamiento de datos en tablas agrupadas
Cada punto de datos se asigna a un punto específico de acuerdo con la siguiente fórmula:
hash_function(bucket_column) modo num_bucket
Ahora, considere la primera tabla que dividimos según el país, nuestros datos de muestra se dividirán en las siguientes secciones:
EMPID | PRIMER NOMBRE | APELLIDO | DEPORTES | CIUDAD | PAÍS |
1002 | Zefr | Stephenson | Grillo | Neerharen | República Dominicana |
1003 | Otoño | Frijol | Baloncesto | Neerharen | República Dominicana |
1004 | Kasimir | Vance | Bádminton | Neerharen | República Dominicana |
1006 | ayanna | Bancos | Fútbol | Neerharen | República Dominicana |
1008 | Imbécil | Batán | Bádminton | Neerharen | República Dominicana |
EMPID | PRIMER NOMBRE | APELLIDO | DEPORTES | CIUDAD | PAÍS |
1001 | esmeril | Blair | Baloncesto | Qutubullapur | San Marino |
1005 | Mufutau | Flores | Qutubullapur | San Marino | |
1007 | Selma | Bola | Tenis | Qutubullapur | San Marino |
1009 | imogen | Terrell | Qutubullapur | San Marino | |
1010 | Colorado | Hutchinson | Tenis | Qutubullapur | San Marino |
Para República Dominicana, cada fila se almacenará en el cubo:
hash_function(1002) modo 4 = 2 (Índice de representación del depósito)
hash_function(1003) modo 4 = 3
hash_function(1004) modo 4 = 0
hash_function(1006) modo 4 = 2
hash_function(1008) modo 4 = 0
Tenga en cuenta que la función hash del valor INT le dará el mismo resultado. Puede verificar los datos en cada archivo en la ubicación de HDFS. Si lo desea, puede repetir este proceso para otros países presentes en la base de datos.
Almacenamiento en cubos en Hive: ejemplo n.º 2
Como ya hemos cubierto los diversos pasos y procedimientos presentes en la implementación de esta función, podemos probarla fácilmente. El siguiente es un ejemplo simple de creación de depósitos en Hive. Aquí, solo hemos agrupado los datos disponibles en diferentes partes para que podamos administrarlos más fácilmente:
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> crear tabla mensual_taxi_fleet6
. . . . . . . . . . . . . . . . . . . . . . .> (mes char(7),pequeña flotaint,empresa varchar(50))
. . . . . . . . . . . . . . . . . . . . . . .> agrupado por (empresa) en 3 cubos
. . . . . . . . . . . . . . . . . . . . . . .> almacenado como avro;
Ejemplo usando Apache Hive versión 1.1.0-cdh5.13.1, hive.enforce.bucketing=false por defecto
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> insertar en month_taxi_fleet6
. . . . . . . . . . . . . . . . . . . . . . .> seleccione mes,flota,empresa de mensual_taxi_flota;
[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet6
-rwxrwxrwt 1 actualizar colmena 25483 2017-12-26 10:40 /usuario/colmena/almacén/monthly_taxi_fleet6/000000_0
— hive.enforce.bucketing: si se aplica el depósito. Si es verdadero, mientras se inserta en la tabla, se aplica el depósito.
— Valor predeterminado: Hive 0.x: falso, Hive 1.x: falso, Hive 2.x: eliminado, lo que lo hace siempre verdadero (HIVE-12331)
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> establecer hive.enforce.bucketing=true;
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> insertar en month_taxi_fleet6
. . . . . . . . . . . . . . . . . . . . . . .> seleccione mes,flota,empresa de mensual_taxi_flota;
[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet6
-rwxrwxrwt 1 subárbol de actualización 13611 2017-12-26 10:43 /user/hive/warehouse/monthly_taxi_fleet6/000000_0
-rwxrwxrwt 1 actualizar colmena 6077 2017-12-26 10:43 /usuario/colmena/almacén/monthly_taxi_fleet6/000001_0
-rwxrwxrwt 1 subárbol de actualización 6589 2017-12-26 10:43 /usuario/colmena/almacén/monthly_taxi_fleet6/000002_0
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> describe la flota_de_taxi_mensual_extendido6;
+—————————–+—————————————————-+———-+–+
| nombre_col | tipo_datos | comentario |
+—————————–+—————————————————-+———-+–+
| mes | char(7) | |
| flota | entero | |
| empresa | varchar(50) | |
| | NULO | NULO |
| Información detallada de la tabla | Table(tableName:monthly_taxi_fleet6, dbName:predeterminado, propietario:actualizar, createTime:1514256031, lastAccessTime:0, retención:0, sd:StorageDescriptor(cols:[FieldSchema(name:month, type:char(7), comment:null) , FieldSchema(nombre:flota, tipo:smallint, comentario:null), FieldSchema(nombre:empresa, tipo:varchar(50), comentario:null)], ubicación:hdfs://cdh-vm.dbaglobe.com:8020 /user/hive/warehouse/monthly_taxi_fleet6, inputFormat:org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat, comprimido:falso, numBuckets :3, serdeInfo:SerDeInfo(nombre:null, serializationLib:org.apache.hadoop.hive.serde2.avro.AvroSerDe, parámetros:{serialization.format=1}), bucketCols:[empresa], sortCols:[], parámetros :{}, skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), storeAsSubDirectories:false), particiónKeys:[], parámetros:{totalSize=26277, numRows=1128, rawDataSize=0, COLUMN_STATS_ACCURATE =verdadero, numArchivos=3, tra nsient_lastDdlTime=1514256192}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE) | |
+—————————–+—————————————————-+———-+–+
5 filas seleccionadas (0,075 segundos)
Pago: Preguntas básicas de la entrevista de Hive
Almacenamiento en cubos en Hive: ejemplo n.º 3
A continuación se muestra un pequeño ejemplo avanzado de agrupamiento en Hive. Aquí, hemos realizado particiones y usado la funcionalidad Ordenado por para hacer que los datos sean más accesibles. Esta es una de las mayores ventajas de la cubeta. Puede usarlo con otras funciones para administrar grandes conjuntos de datos de manera más eficiente y efectiva.
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> crear tabla mensual_taxi_fleet7
. . . . . . . . . . . . . . . . . . . . . . .> (mes char(7),pequeña flota)
. . . . . . . . . . . . . . . . . . . . . . .> particionado por (empresa varchar(50))
. . . . . . . . . . . . . . . . . . . . . . .> agrupados por (mes) ordenados por (mes) en 3 cubos
. . . . . . . . . . . . . . . . . . . . . . .> almacenado como avro;
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> insertar en month_taxi_fleet7
. . . . . . . . . . . . . . . . . . . . . . .> partición (empresa)
. . . . . . . . . . . . . . . . . . . . . . .> seleccione mes,flota,empresa de mensual_taxi_flota;
[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet7
drwxrwxrwt – actualizar colmena 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab
-rwxrwxrwt 1 actualizar colmena 865 2017-12-26 11:05 /usuario/colmena/almacén/monthly_taxi_fleet7/company=CityCab/000000_0
-rwxrwxrwt 1 actualizar subárbol 865 2017-12-26 11:05 /usuario/colmena/almacén/monthly_taxi_fleet7/company=CityCab/000001_0
-rwxrwxrwt 1 actualizar colmena 865 2017-12-26 11:05 /usuario/colmena/almacén/monthly_taxi_fleet7/company=CityCab/000002_0
drwxrwxrwt – actualizar subárbol 0 2017-12-26 11:05 /usuario/colmena/almacén/monthly_taxi_fleet7/empresa=Confort
-rwxrwxrwt 1 subárbol de actualización 913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000000_0
-rwxrwxrwt 1 subárbol de actualización 913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000001_0
-rwxrwxrwt 1 subárbol de actualización 913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000002_0
drwxrwxrwt – actualizar colmena 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow- Top
-rwxrwxrwt 1 actualizar colmena 865 2017-12-26 11:05 /usuario/colmena/almacén/monthly_taxi_fleet7/company=Individual Yellow- Top/000000_0
-rwxrwxrwt 1 actualizar colmena 865 2017-12-26 11:05 /usuario/colmena/almacén/monthly_taxi_fleet7/company=Individual Yellow- Top/000001_0
-rwxrwxrwt 1 actualización hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow- Top/000002_0
drwxrwxrwt – actualizar subárbol 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier
-rwxrwxrwt 1 subárbol de actualización 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000000_0
-rwxrwxrwt 1 subárbol de actualización 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000001_0
-rwxrwxrwt 1 subárbol de actualización 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000002_0
drwxrwxrwt – actualizar subárbol 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime
-rwxrwxrwt 1 actualizar colmena 765 2017-12-26 11:05 /usuario/colmena/almacén/monthly_taxi_fleet7/company=Prime/000000_0
-rwxrwxrwt 1 actualizar subárbol 765 2017-12-26 11:05 /usuario/colmena/almacén/monthly_taxi_fleet7/company=Prime/000001_0
-rwxrwxrwt 1 subárbol de actualización 766 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime/000002_0
drwxrwxrwt – actualizar subárbol 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT
-rwxrwxrwt 1 subárbol de actualización 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000000_0
-rwxrwxrwt 1 subárbol de actualización 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000001_0
-rwxrwxrwt 1 subárbol de actualización 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000002_0
drwxrwxrwt – actualizar subárbol 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart
-rwxrwxrwt 1 actualización hive 720 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart/000000_0
-rwxrwxrwt 1 subárbol de actualización 719 2017-12-26 11:05 /usuario/colmena/almacén/monthly_taxi_fleet7/company=Smart/000001_0
-rwxrwxrwt 1 subárbol de actualización 719 2017-12-26 11:05 /usuario/colmena/almacén/monthly_taxi_fleet7/company=Smart/000002_0
drwxrwxrwt – actualizar subárbol 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab
-rwxrwxrwt 1 subárbol de actualización 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000000_0
-rwxrwxrwt 1 subárbol de actualización 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000001_0
-rwxrwxrwt 1 subárbol de actualización 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000002_0
drwxrwxrwt – actualizar subárbol 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC
-rwxrwxrwt 1 subárbol de actualización 432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000000_0
-rwxrwxrwt 1 subárbol de actualización 432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000001_0
-rwxrwxrwt 1 subárbol de actualización 432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000002_0
Obtenga más información sobre la creación de particiones y la agrupación en cubos en Hive
En los ejemplos que compartimos antes, realizamos particiones y depósitos en Hive de varias maneras y aprendimos cómo puede implementarlos en Hive. Sin embargo, Apache Hive tiene muchas otras funcionalidades y aprender sobre todas ellas puede ser bastante desalentador.
Es por eso que recomendamos tomar un curso de ingeniería de datos. Le permitiría estudiar de expertos de la industria que han pasado años en esta industria. Un curso le proporciona un plan de estudios estructurado en el que aprende todo paso a paso. En upGrad, ofrecemos cursos de ingeniería de datos dedicados .
Con nuestros cursos, usted obtiene acceso al Rincón de Éxito Estudiantil de upGrad, donde obtiene comentarios personalizados sobre su currículum, preparación para entrevistas, asesoramiento profesional y muchas otras ventajas.
Después de completar el curso, será un profesional experto en ingeniería de datos.
Conclusión
El agrupamiento en Hive es muy simple y fácil de realizar. Sin duda, es una función útil para grandes conjuntos de datos. Sin embargo, cuando realiza particiones y depósitos en Hive juntos, puede administrar conjuntos de datos bastante grandes con mucha facilidad.
Si está interesado en saber más sobre el programa Big Data, consulte nuestro programa PG Diploma in Software Development Specialization in Big Data, que está diseñado para profesionales que trabajan y proporciona más de 7 estudios de casos y proyectos, cubre 14 lenguajes y herramientas de programación, manos prácticas. en talleres, más de 400 horas de aprendizaje riguroso y asistencia para la colocación laboral con las mejores firmas.
Si tiene alguna pregunta o idea sobre el depósito, compártala en los comentarios a continuación. Nos encantaría saber de usted.
Consulte nuestros otros cursos de ingeniería de software en upGrad.