Operaciones básicas de Hive
A continuación, aprenderemos algunas operaciones básicas en Hive. Además de algunas de las declaraciones de operación mencionadas en esta sección, todas las declaraciones de Hive se pueden encontrar en su Manual de lenguaje. Puede probar más declaraciones después de terminar esta sección.
Creación de una tabla
Primero, necesita obtener algunos datos. Los datos utilizados en esta sección del experimento son principalmente un archivo de registro que simula el servidor NginX, que se puede utilizar para analizar las vistas de página del sitio web.
Vuelva a abrir una terminal y escriba los siguientes comandos en la terminal para descargar los datos de muestra:
su hadoop
cd ~
wget http://labfile.oss-cn-hangzhou.aliyuncs.com/courses/567/log_example.csv
Luego, cargue el archivo a HDFS:
hdfs dfs -mkdir -p /user/data/staging/page_view
hdfs dfs -put /home/hadoop/log_example.csv /user/data/staging/page_view
Lo primero después de tener los datos es crear la tabla. Si desea crear una tabla page_view
para los datos anteriores, debe escribir la siguiente declaración en la línea de comandos de Hive:
CREATE TABLE page_view(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
STORED AS SEQUENCEFILE;
En este ejemplo, se asigna a cada columna de la tabla un tipo adecuado. Además, podemos adjuntar comentarios a los niveles de columna y tabla. Además, la cláusula PARTITIONED BY
define una columna de partición que es diferente a la columna de datos. La columna de partición no se almacena con la columna de datos. Cuando especifica una columna de partición de esta manera, se utiliza un carácter de nueva línea como separador para cada fila.
Si los datos no están en el formato anterior, puede parametrizar el separador de campos como se muestra en el siguiente ejemplo:
La siguiente declaración solo es para fines de demostración y no debe escribirse en el shell de hive
.
CREATE TABLE page_view1(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
STORED AS SEQUENCEFILE;
Dado que el separador de líneas está determinado por el separador en el sistema de Hadoop en lugar de por Hive, no podemos cambiar manualmente el separador de líneas.
Por lo general, la tabla en la que se determinan los datos de columna se almacena en un bucket, lo que facilitará la muestra eficiente de la consulta del conjunto de datos. Si no hay bucket, incluso si se puede completar la muestra aleatoria de la tabla, no se puede lograr una muestra eficiente en el proceso de barrido de todos los datos. El siguiente ejemplo muestra cómo habilitar el almacenamiento en buckets para la tabla page_view
en la columna userid
.
La siguiente declaración solo es para fines de demostración y no debe escribirse en el shell de hive
.
CREATE TABLE page_view2(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
COLLECTION ITEMS TERMINATED BY '2'
MAP KEYS TERMINATED BY '3'
STORED AS SEQUENCEFILE;
En el ejemplo anterior, la columna userid
en la tabla se agrega a 32 buckets mediante una función hash. En cada bucket, los datos se ordenan en orden ascendente de viewTime
. Este método de organización de datos permite a los usuarios muestrear eficazmente las columnas agregadas (aquí la columna userid
), y la característica de clasificación permite a los administradores de datos evaluar las consultas de manera más eficiente a través de mejores estructuras de datos.
La siguiente declaración solo es para fines de demostración y no debe escribirse en el shell de hive
.
CREATE TABLE page_view3(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Friends ARRAY<BIGINT>, properties MAP<STRING, STRING>,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
COLLECTION ITEMS TERMINATED BY '2'
MAP KEYS TERMINATED BY '3'
STORED AS SEQUENCEFILE;
En el ejemplo anterior, el formato de cada fila en la tabla se define en términos de nombres y tipos de campo, bastante similar a las definiciones de tipos en otros lenguajes de programación. Tenga en cuenta que los nombres de tabla y columna no distinguen entre mayúsculas y minúsculas. IP Address of the User
y la declaración COMMENT
a continuación indican que podemos agregar comentarios a los niveles de columna y tabla. Además, la cláusula PARTITIONED BY
define columnas de partición que son diferentes a las columnas de datos. Como se mencionó anteriormente, en realidad no almacenan los datos. La cláusula CLUSTERED BY
especifica qué columna utilizar para crear cuántos buckets. La cláusula ROW FORMAT DELIMITED
especifica cómo almacenar las filas en una tabla de Hive. Para los formatos delimitados, esta declaración especifica cómo determinar el símbolo de terminación de un campo, cómo determinar el símbolo de terminación de un elemento en una colección (matriz o mapa) y el símbolo de terminación para determinar la clave de terminación del mapa, donde los números están en codificación ASCII. STORED AS SEQUENCEFILE
indica que los datos se almacenan en HDFS en formato binario (específicamente el tipo SequenceFile
de Hadoop). Entre ellos, las configuraciones en las cláusulas ROW FORMAT
y STORED AS
son los valores predeterminados que Hive está utilizando actualmente. Por lo tanto, no los escribimos explícitamente en la declaración que creó la tabla al principio.
Exploración de tablas y particiones
Si desea enumerar las tablas existentes en su almacén, puede utilizar la siguiente declaración:
SHOW TABLES;
Si hay muchas tablas, la declaración anterior generará mucha información de retorno. Puede reducir el alcance especificando un prefijo. Por ejemplo, si desea enumerar una tabla con el prefijo page
, puede utilizar la siguiente declaración:
SHOW TABLES 'page.*';
Las reglas de coincidencia en esta declaración son las mismas que la sintaxis de expresiones regulares, y el punto (.
) representa un comodín.
Si desea enumerar las particiones de una tabla, use la siguiente declaración. Si la tabla no es una tabla particionada, no se devuelven información:
SHOW PARTITIONS page_view;
Si desea enumerar las columnas y los tipos de columna de una tabla, puede utilizar la declaración DESCRIBE
:
DESCRIBE page_view;
Si desea enumerar las columnas de la tabla y todas sus otras propiedades, debe agregar la palabra clave EXTENDED
. Esto imprimirá mucha información, que generalmente se utiliza para depurar:
DESCRIBE EXTENDED page_view;
Modificación de una tabla
Si desea cambiar el nombre de una tabla existente, use la declaración ALTER TABLE
con RENAME TO
. Si ya existe una tabla con el nuevo nombre, se devuelve un error:
ALTER TABLE page_view RENAME TO new_page_view;
Ver el resultado:
hive> ALTER TABLE page_view RENAME TO new_page_view;
OK
Time taken: 0.124 seconds
hive> show tables;
OK
new_page_view
...
Time taken: 0.021 seconds, Fetched: 4 row(s)
También podemos cambiar los nombres de las columnas de una tabla existente. Sin embargo, es importante tener en cuenta que debe utilizar el mismo tipo de columna y incluir un registro en cada una de las columnas existentes:
ALTER TABLE new_page_view REPLACE COLUMNS (viewTime INT, userid BIGINT, page_url STRING, referrer_url STRING, ipaddr STRING COMMENT 'IP Address of the User');
Además, puede agregar nuevas columnas a una tabla existente:
ALTER TABLE new_page_view ADD COLUMNS (new_column INT COMMENT 'a new int column');
Tenga en cuenta que los cambios en el esquema (como agregar una columna) conservarán el esquema para la antigua partición de la tabla para evitar que se convierta en una tabla particionada. Todas las consultas que acceden a estas columnas y se ejecutan en la antigua partición devuelven implícitamente valores nulos o los valores predeterminados especificados para esas columnas.
Eliminación de tablas y particiones
Dado que Hive está diseñado como un almacén de datos, la destrucción de datos siempre es negativa. Por lo tanto, la operación de eliminar una tabla es un poco complicada. Usar el comando DROP
en la tabla eliminará implícitamente cualquier índice construido en la tabla.
Puede usar los siguientes comandos para eliminar una tabla:
DROP TABLE new_page_view;