4. Manipulación de datos HiveSQL, lenguaje de consulta (DML, DQL)

1. Hive SQL-DML-Load carga datos

Función
Cargar, cargar se refiere a mover la vista a la posición correspondiente a la tabla Hive, y el movimiento es una operación pura de copiar y mover

reglas gramaticales

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] [INPUTFORMAT 'inputformat' SERDE 'serde'] (3.0 or later)

La ruta de archivo de la regla de sintaxis
ruta de archivo indica la ruta que se va a mover. Puede apuntar a un archivo, o simplemente a un directorio (mover todos los archivos en el directorio).La
ruta del archivo admite rutas relativas, rutas absolutas y URI completos con esquema, que deben considerarse en combinación con la palabra clave LOCAL

LOCAL de reglas gramaticales

  • Especifique LOCAL, la ruta del archivo se buscará en el sistema de archivos local
    • Si apunta a una ruta relativa, se interpretará en relación con el directorio de trabajo actual del usuario.
    • También puede ser un URI completo, por ejemplo: file:///user/hive/project/data1
  • LOCAL no especificado
    • Si la ruta del archivo apunta a un URI completo, este URI se usará directamente
    • Si no se especifica ningún esquema, Hive utilizará el parámetro fs.default.name especificado en el archivo de configuración de hadoop (como era de esperar, es HDFS)

El sistema de archivos de texto LOCAL se refiere al sistema de archivos local de Linux de la máquina donde se encuentra el servicio Hiveserver2, no al sistema de archivos local donde se encuentra el cliente de Hive.

OVERWRITE de reglas gramaticales
Si se usa la palabra clave OVERWRITE, los datos existentes en la tabla (o partición) de destino se eliminarán y, luego, el contenido del archivo/directorio al que apunta la ruta del archivo se agregará a la tabla/partición.

1.1 练习:Cargar datos desde FS local o HDFS

1. Practicar la carga de datos desde el FS local
2. Practicar la carga de datos desde HDFS
3. Comprender los caracteres chinos de la palabra clave local
4. Practicar la carga de datos en la tabla de particiones

-- step1:建表
-- 建表student_local 用于演示从本地加载数据
create table student_local(num int,name string,sex string,age int,dept string) row format delimited fields terminated by ",";
-- 建表student_HDFS 用于演示从HDFS加载数据
create external table student_HDFS(num int,name string,sex string,age int,dept string) row format delimited fields terminated by ",";
-- 建表student_HDFS_p 用于演示从HDFS加载数据到分区表
create table student_HDFS_p(num int,name string,sex string,age int,dept string) partitioned by(country string) row format delimited fields terminated by ",";

-- 建议使用beeline客户端 可以显示出加载过程日志
-- step2:加载数据
-- 从本地加载数据 数据位于HS2(node1)本地文件系统 本质是hadoop fs -put上传操作
LOAD DATA LOCAL INPATH '/root/hivedata/students.txt' INTO TABLE student_local;

-- 从HDFS加载数据 数据位于HDFS文件系统根目录下 本质是hadoop fs -mv 移动操作
-- 先把数据上传到HDFS上 hadoop fs -put /root/hivedata/students.txt /
LOAD DATA INPATH '/students.txt' INTO TABLE student_HDFS;

-- 从HDFS加载数据到分区表中并指定分区,数据位于HDFS文件系统根目录下
-- 先把数据上传到HDFS上 hadoop fs -put /root/hivedata/students.txt /
LOAD DATA INPATH '/students.txt' INTO TABLE student_HDFS_p partition(country="China");

1.2 Nuevas características de Hive3.0

  • Hive3.0+, al cargar datos, además de mover y copiar operaciones, en algunos casos, la carga se reescribirá como INSERTAR COMO SELECCIONAR
  • Hive3.0+ también admite el uso de formato de entrada y SerDe para especificar el formato de entrada, como Texto, ORC, etc.
    Por ejemplo, si la tabla tiene particiones, el comando de carga no especifica una partición, entonces la carga se convierte en INSERTAR COMO SELECCIONAR, y se supone que la última columna es la columna de partición, si el archivo es costoso y esperado, arroja un error

Por ejemplo

CREATE TABLE IF NOT EXISTS tab1(col1 int, col2 int)
PARTITIONED BY (col3 int)
row format delimited fields terminated by ',';

-- 在hive3.0之后 新特性可以帮助我们把load改写为insert as select
LOAD DATA LOCAL INPATH '/root/hivedata/tab1.txt' INTO TABLE tab1;

--tab1.txt内容如下
11,22,1
33,44,2

2. Inserción SQL-DML de Hive

2.1 insertar+seleccionar

insertar+seleccionar significa: insertar el resultado devuelto por la siguiente consulta en la tabla especificada como contenido, y tenga en cuenta que OVERWRITE sobrescribirá los datos existentes.

  1. Elija asegurarse de que la cantidad de columnas de resultados de la consulta sea consistente con la cantidad de columnas que deben insertarse en la tabla de datos
  2. Si el tipo de datos consultado no es coherente con el tipo de datos de la columna correspondiente insertado en la tabla, se convertirá, pero no hay garantía de que la conversión sea exitosa, y los datos que fallan en la conversión serán NULL.
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;

INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;
-- step1:创建一张源表student
drop table if exists student;
create table student(num int,name string,sex string,age int,dept string)
row format delimited
fields terminated by ',';
-- 加载数据
load data local inpath '/root/hivedata/students.txt' into table student;

-- step2:创建一张目标表 只有两个字段
create table student_from_insert(sno int,sname string);
-- 使用insert+select插入数据到新表中
insert into table student_from_insert select num,name from student;

2.2 inserciones múltiples inserciones múltiples

  • Cuando se traduce en caridad múltiple, inserciones múltiples, su función principal: un escaneo, inserciones múltiples
  • El propósito de la sintaxis es reducir el número de escaneos, en un solo escaneo. Completa múltiples operaciones de inserción
-- 当库里有一张表student
select * from student;
-- 创建两张新表
create table student_insert1(sno int);
create table student_insert2(sname string);
-- 多重插入
from student
insert overwrite table student_insert1
select num
insert overwrite table student_insert2
select name;

2.3 inserción de partición dinámica inserción de partición dinámica

descripción general

  • La inserción de partición dinámica significa que el valor de la partición está determinado dinámicamente por el resultado de la declaración de consulta de selección posterior
  • Particionamiento automático basado en los resultados de la consulta
-- 1.首先设置动态分区模式为非严格模式 默认已经开启了动态分区功能
set hive.exec.dynamic.partition = true;
set hive.exec.dynamic.partition.mode = nonstrit;

-- 2.当前库下有一张表student
select * from student;

-- 3.创建分区表 以sdept作为分区字段
create table student_partition(Sno int, Sname string, Sex string, Sage int) partitioned by(Sdept string);

-- 4.执行动态分区插入操作
insert into table student_partition partition(Sdept)
select num,name,sex,age,dept from student;
-- 其中,num,name,sex,age作为表的字段内容插入表中
-- dept作为分区字段值

2.4 insertar datos de exportación de directorio

Formato de sintaxis
Hive admite exportar el resultado de la consulta de selección a un archivo y almacenarlo en el sistema de archivos. El formato de sintaxis es el siguiente:
Nota: La operación de exportación es una operación de SOBREESCRIBIR, tenga cuidado

-- 标准语法:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1
    [ROW FORMAT row_format] [STORED AS file_format]
SELECT ...FROM...

-- Hive extension(multiple inserts):
FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2]...

-- row_format
DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
  • Los directorios pueden ser URI completos. Si no se especifica ningún esquema, Hive utilizará la variable de configuración de hadoop fs.default.name para determinar la ubicación de exportación
  • Si se usa la palabra clave LOCAL, Hive escribirá los datos en un directorio en el sistema de archivos local
  • Los datos escritos en el sistema de archivos se serializan como texto, con columnas separadas por \001 y filas separadas por saltos de línea. Si ninguna de las columnas son tipos de datos primitivos, esas columnas se serializarán en formato JSON. También puede especificar la nueva línea del delimitador y el formato de archivo al importar
-- 导出操作演示
-- 当前库下已有一张表student
select * from student;

-- 1.导出查询结果到HDFS指定目录下
insert overwrite directory '/tmp/hive_export/e1' select * from student;

-- 2.导出时指定分隔符和文件存储格式
insert overwrite directory '/tmp/hive_export/e2' row format delimited fields terminated by ','
stored as orc
select * from student;

-- 3.导出数据到本地文件系统指定目录下
insert overwrite local directory '/root/hive_export/e1' select * from student;

3. Tabla de transacciones Hive Transaction

3.1 Principio de implementación

Principio de realización
Los archivos de Hive se almacenan en HDFS, y HDFS no admite la modificación arbitraria de archivos, por lo que solo se puede hacer por otros medios.

  1. Use archivos HDFS como datos originales y use delta para guardar los datos incrementales de registro de las operaciones de transacción
  2. La transacción que se está ejecutando se mantiene en la carpeta que comienza con la preparación y la carpeta delta es el final de la ejecución. Cada vez que se realiza una operación de transacción, habrá una carpeta incremental delta
  3. Al acceder a los datos de Hive, fusione los archivos originales HDFS y los archivos incrementales delta para consultar los datos más recientes.
  • La instrucción INSERT creará directamente el directorio delta
  • ELIMINAR prefijo de directorio eliminar - delta
  • La instrucción UPDATE implementa la función de actualización dividida, es decir, eliminar primero y luego insertar

formato de nomenclatura de carpetas delta

  • delta_minWID_maxWID_stmtID, es decir, el prefijo delta, la posición de ID de la transacción de escritura y el ID de declaración; el prefijo para la eliminación es delete_delta, que contiene el archivo que se eliminará
  • Hive creará un ID de transacción de escritura (ID de escritura) para transacciones de escritura (INSERTAR, ELIMINAR, etc.), que es único dentro del alcance de la tabla.
  • El ID de declaración (ID de declaración) se usa cuando hay varias declaraciones de escritura en una transacción y se usa como un identificador único

Debajo de la carpeta delta de cada transacción, hay dos archivos:

  1. El contenido de _orc_acid_version es 2, es decir, el número de versión actual de ACID es 2. La principal diferencia con la versión 1 es que la instrucción UPDATE adopta la función de actualización dividida, es decir, eliminar primero y luego insertar. Este archivo no es un archivo ORC, puede descargarlo y verlo directamente
  2. El archivo bucket_00000 es el contenido de datos escrito. Si la tabla de transacciones no tiene particiones ni cubos, solo hay un archivo de este tipo. Los archivos se almacenan en formato ORC, el binario subyacente, use ORC TOOLS para ver
    la operación: 0 significa insertar, 1 significa actualizar, 2 significa eliminar. Dado que se utiliza la actualización dividida, UPDATE no aparecerá, por lo que la operación en el archivo delta es 0 y la operación en el archivo delete_delta es 2
    originalTransaction, currentTransaction: el ID de transacción de escritura original de este registro, el ID de transacción de escritura actual ID de
    fila : una ID única de incremento automático, una fila única en la combinación de transacciones de escritura y almacenamiento
    : datos específicos. Para la declaración DELETE, es nulo, para INSERT son los datos insertados, para UPDATE son los datos actualizados

Combinador (Compactador)

  • A medida que se modifica la tabla, se crean más y más archivos incrementales delta, que deben fusionarse para mantener un rendimiento suficiente
  • Heweapon Compactor es un proceso en segundo plano que se ejecuta en Hive Metastore y es compatible con el sistema ACID. Todas las fusiones se realizan en segundo plano y no impiden lecturas y escrituras simultáneas de datos. Después de la fusión, el sistema esperará a que se completen las operaciones de lectura de todos los archivos antiguos antes de eliminar los archivos antiguos.
  • Hay dos tipos de operaciones de fusión, compactación menor (fusión pequeña), compactación mayor (fusión grande)
    • La combinación pequeña reescribirá un grupo de archivos incrementales delta en un solo archivo incremental, la condición de activación predeterminada es 10 archivos delta
    • La fusión grande reescribe uno o más archivos incrementales y archivos base en un nuevo archivo base, y la condición de activación predeterminada es que el archivo delta corresponde al 10 % del archivo base.

3.2 Configuración y limitaciones de uso de la tabla de transacciones

Limitaciones
Aunque Hive admite transacciones con semántica ACID, no es tan conveniente de usar como en MySQL y tiene muchas limitaciones.

  1. BEGIN, COMMIT y ROLLBACK aún no son compatibles, todas las operaciones de idioma se confirman automáticamente
  2. El formato de almacenamiento de archivos de tabla solo es compatible con ORC
  3. Los parámetros de configuración son necesarios para permitir el uso de transacciones
  4. Las tablas externas no se pueden crear como transacciones porque Hive solo puede controlar metadatos y no puede administrar datos.
  5. El parámetro de atributo de tabla transaccional debe establecerse en verdadero
  6. El administrador de transacciones de Hive debe establecerse en org.apache.hadoop.hive.ql.lockmgr.DbTxnManager para usar tablas ACID
  7. La transacción no admite la instrucción LOAD DATA...

Establecer parámetros
del lado del cliente

set hive.support.concurrency = true; -- Hive是否支持并发
set hive.enforce.bucketing = true; -- 从Hive2.0开始就不再需要 是否开启分桶功能
set hive.exec.dynamic.partition.mode = nonstrict; -- 动态分区模式 非严格
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; 

Servidor:

set hive.compactor.initiator.on = true; -- 是否在Metastore实例上运行启动线程和清理线程
set hive.compactor.worker.threads = 1; -- 在此metastore实例上运行多个压缩程序工作线程

4.Hive SQL-DML-Actualizar, Eliminar

descripción general

  • Hive es un almacén de datos basado en Hadoop y es una herramienta de análisis de soporte orientada al análisis. Mapee la estructura existente y los archivos de datos en tablas, y luego proporcione la capacidad de SQL para analizar datos
  • Por lo tanto, la operación común en Hive es analizar la operación de selección de consulta
  • Hive no admitía la sintaxis de actualización y eliminación en los primeros días, porque los datos procesados ​​por Hive son todos los datos existentes y los datos históricos.
  • Hive posterior admite operaciones de actualización y eliminación relacionadas, pero existen muchas limitaciones
-- 创建Hive事务表
create table trans_student(
    id int,
    name string,
    age int
) stored as orc TBLPROPERTIES('transactional'='true');

-- 针对事务表进行insert update delete操作
insert into trans_student(id, name, age)
values(1,"Allen",18);

update trans_student
set age = 20
where id = 1;

delete from trans_student where id = 1;

5. Hive SQL-DQL-Seleccionar datos de consulta

árbol de sintaxis

  • Dónde consultar depende de table_reference que sigue a la palabra clave FROM. Puede ser una tabla física ordinaria, una vista, un resultado de combinación o un resultado de subconsulta
  • Los nombres de tablas y columnas no distinguen entre mayúsculas y minúsculas
[WITH CommonTableExpression (, CommonTableExpression) *]
SELECT [ALL|DISTINCT] select_expr,select_expr,...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[ORDER BY col_list]
[CLUSTER BY col_list
    | [DISTRIBUTE BY col_list] [SORT BY col_list]
]
[LIMIT [offset,] row];

5.1 Caso: seleccione consulta de datos de la nueva corona de Covid-19 de EE. UU.

Prepare el entorno de prueba de gramática seleccionado, el archivo de datos "us_covid19-counties.dat", que registra el número acumulado de casos confirmados y el número acumulado de muertes en cada condado de los Estados Unidos el 28-01-2021

数据示例:
2021-01-28,Coffee,Alabama,01031,4795,72

Preparación del entorno de datos

-- step1:创建普通表t_usa_covid19
drop table if exists t_usa_covid19;
create table t_usa_covid19(
    count_date string,
    county string,
    state string,
    fips int,
    cases int,
    deaths int
) row format delimited fields terminated by ',';
-- 将源数据load加载到t_usa_covid19表对应的路径下
load data local inpath '/root/hivedata/us-covid19-counties.dat' into table t_usa_covid19;

-- step2:创建一张分区表 基于count_date日期,state州进行分区
create table if not exists t_usa_covid19_p(
    county string,
    fips int,
    deaths int
)partitioned by(count_date string,state string)
row format delimited fields terminated by ',';

-- step3:使用动态分区插入将数据导入t_usa_covid19_p中
set hive.exec.dynamic.partition.mode = nonstrict;

insert into table t_usa_covid19_p partion(count_date,state)
select county,fips,cases,deaths,count_date,state from t_usa_covid19;

Práctica básica de gramática
select_expr
select_expr indica la columna devuelta por la consulta de recuperación, debe haber al menos una select_expr

-- 1.select_expr
-- 查询所有字段或者指定字段
select * from t_usa_covid19_p;
select county, cases, deaths from t_usa_covid19_p;

-- 查询匹配正则表达式的所有字段
SET hive.support.quoted.identifiers =none;
select `^c.*` from t_usa_covid19_p; --反引号不在解释为其他含义,被解释为正则表达式
-- 查询当前数据库
select current_database(); -- 省去from关键字
-- 查询使用函数
select count(county) from t_usa_covid19_p;

TODOS, DISTINTOS
se utilizan para especificar cómo tratar las filas duplicadas en los resultados de la consulta
1. Si no se brindan estas opciones, el valor predeterminado es TODOS
DISTINTOS para especificar la eliminación de filas duplicadas del conjunto de resultados.

-- 2.ALL、DISTINCT
-- 返回所有匹配的行
select state from t_usa_covid19_p;
-- 相当于
select all state from t_usa_covid19_p;
-- 返回所有匹配的行 去除重复结果
select distinct state from t_usa_covid19_p;
-- 多个字段distinct 整体去重
select county,state from t_usa_covid19_p;
select distinct county,state from t_usa_covid19_p;
select distinct sex from student;

DÓNDE

  • Where va seguido de una expresión booleana para el filtrado de consultas
  • En la expresión where, se puede usar cualquier función y operador compatible con Hive, excepto la función de agregación (porque la función de agregación la usa bajo la premisa de que se ha determinado el conjunto de resultados. La cláusula where todavía está en el proceso de "determinar "el conjunto de resultados, por lo que no se pueden usar funciones agregadas)
  • A partir de Hive0.13, la cláusula where admite ciertos tipos de subconsultas
-- 3.WHERE CAUSE
select * from t_usa_covid19_p where 1 > 2;
select * from t_usa_covid19_p where 1 = 1;
-- where 条件中使用函数 找出州名字字母长度超过10位的有哪些
select * from t_usa_covid19_p where length(state) > 10;
-- where 子句支持子查询
select *
from A
where A.a in (select foo from B);

Consulta de partición, poda de partición

  • Para las tablas particionadas de Hive, las consultas de partición se pueden especificar al realizar consultas para reducir los análisis completos de la tabla, también conocido como eliminación de particiones.
  • La llamada poda de particiones: Al consultar una tabla particionada, comprobará si existe un filtro en el campo de partición en la cláusula where o en la cláusula on de la unión, si existe, solo las particiones que cumplan las condiciones de la se accederá a la consulta, es decir, no se cortarán las condiciones de acceso.
-- 4.分区查询、分区裁剪
-- 找出来自加州,累计死亡人数大于1000的县 state字段就是分区字段 进行分区裁剪 避免全表扫描
select * from t_usa_covid19_p where state = "California" and deaths > 1000;
-- 多分区裁剪
select * from t_usa_covid19_p where count_date = "2021-01-28" and state = "California" and deaths > 1000;

AGRUPAR POR

  • La instrucción group by se usa para combinar la función de agregado para agrupar los resultados de acuerdo con una o más columnas.
    Nota: el campo de select_expr en group by aparece: ya sea el campo agrupado por group by; o el campo aplicado por la función de agregado ( evitar una ambigüedad de campo de múltiples valores)
-- 5.GROUP BY
-- 根据state州进行分组
-- 被聚合函数应用
select state,count(deaths)
from t_usa_covid19_p where count_date = "2021-01-28" group by state;

TENIENDO

  • La razón para agregar la cláusula HAVING en SQL es que la palabra clave WHERE no se puede usar con funciones agregadas
  • La cláusula HAVING nos permite filtrar los grupos de datos después de la agrupación, y podemos usar funciones agregadas en Have, porque en este momento, se han ejecutado where y group by, y se ha determinado el conjunto de resultados.
-- 6.HAVING
-- 统计死亡病例数大于10000的州
-- 先where分组过滤(此处是分组裁剪),在进行group by分组,分组后每个结果集确定在使用having过滤
select state,sum(deaths)
from t_usa_covid19_p
where count_date = "2021-01-28"
group by state
hvaing sum(deaths) > 10000;

-- 在group by 的时候组合函数已经作用得到结果 having直接引用结果过滤 不需要再单独计算一次了
select state,sum(deaths) as cnts
from t_usa_covid19_p
where count_date = "2021-01-28"
group by state
hvaing cnts > 10000;

La diferencia entre TENER y DONDE

  • Tener es filtrar los datos después de agrupar
  • Donde realmente filtra los datos antes de agruparlos,
  • Las funciones de agregación se pueden utilizar después de haber
  • Las funciones agregadas no se pueden usar después de donde

LÍMITE

  • límite se utiliza para limitar el número de filas devueltas por la declaración de selección
  • límite acepta uno o dos argumentos numéricos, los cuales deben ser constantes enteras negativas
  • El primer parámetro especifica el desplazamiento de la primera fila que se devolverá (a partir de Hive 2.0.0) y el segundo parámetro especifica el número máximo de filas que se devolverán. Cuando se proporciona un único argumento, representa el número máximo de filas y el desplazamiento predeterminado es 0.
-- 7.limit
-- 返回2021-1-28加州的前5条数据
select * from t_usa_covid19_p
where count_date = "2021-01-28"
and state = "California"
limit 5;

-- 返回结果从第行3开始,共3行
select * from t_usa_covid19_p
where count_date = "2021-01-28"
and state = "California"
limit 2,3; -- 注意:第一个参数偏移量是从0开始的

orden de ejecución

  • Orden de ejecución durante la consulta: desde > donde > grupo (incluida la agregación) > teniendo > orden > seleccionar
    • Las declaraciones agregadas (sum, min, max, avg, count) se ejecutan con prioridad sobre tener cláusulas
    • La cláusula where se ejecuta antes de la declaración de agregación (sum, min, max, avg, count) en el proceso de consulta

5.2 Sintaxis de consulta de alto nivel

ORDENAR POR

  • La sintaxis ORDER BY en Hive SQL es similar a la sintaxis ORDER BY en el lenguaje SQL estándar y ordenará globalmente los resultados de salida.
  • La clasificación predeterminada es ascendente (ASC) y también se puede especificar como DESC descendente
  • En Hive 2.1.0 y versiones posteriores, se admite especificar el orden de clasificación de los resultados de tipo nulo para cada columna en la cláusula ORDER BY (ASC se establece de manera predeterminada en nulo primero y DESC se establece de manera predeterminada en nulo después)
-- 1.order by
-- 根据字段进行排序
select * from t_usa_covid19_p
where count_date = "2021-01-28"
and state = "California"
order by deaths;

select * from t_usa_covid19_p
where count_date = "2021-01-28"
and state = "California"
order by deaths desc;

-- 强烈建议将LIMIT与ORDER BY一起使用,避免数据集行数过大
-- 当hive.mapred.mode设置为严格模式时,使用不带LIMIT的ORDER BY会引发异常
select * from t_usa_covid19_p
where count_date = "2021-01-28"
and state = "California"
order by deaths desc
limit 3;

CLUSTER POR

  • Agrupe los datos según el campo especificado y luego ordene los datos en orden positivo según el campo (solo orden positivo)
    • hash hash de regla de agrupación
    • Dividido en varios grupos dependiendo del número de tareas reducidas
-- 2.cluster by
select * from student;
-- 不指定reducetask个数(自动设置为1)
select * from student cluster by num;

-- 手动设置reducetask个数
set mapreduce.job.reduces=2;
select * from student cluster by num;

Limitaciones de CLUSTER BY
Requisitos: dividir en dos partes según el sexo y el género, y ordenar en orden inverso a la edad en cada grupo

  • cluster by no se puede hacer solo, por lo que el campo para agrupar y ordenar solo puede ser el mismo
  • order by ya no se puede usar aquí, porque es una ordenación global y solo hay una salida, que no puede satisfacer la demanda

DISTRIBUIR POR + ORDENAR POR
DISTRIBUIR POR + ORDENAR POR es equivalente a dividir la función de CLUSTER POR en dos:
si los campos de DISTRIBUIR POR + ORDENAR POR son los mismos, entonces: CLUSTER POR = DISTRIBUIR POR + ORDENAR POR
1. DISTRIBUIR POR es responsable de especificar la agrupación de campos
2.ORDENAR POR es responsable de las reglas de clasificación dentro del grupo.
La agrupación y la clasificación de campos pueden ser diferentes

-- 案例:把学生表数据根据性别分为两个部分,每个分组内根据年龄的倒序排序
select * from student distribute by sex sort by age desc;

La consulta conjunta de unión
UNION se utiliza para combinar los resultados de varias declaraciones de selección en un conjunto de resultados
1. El uso de la palabra clave DISTINCT tiene el mismo efecto predeterminado que el uso de UNION, y las filas duplicadas se eliminarán. Las versiones de Hive anteriores a la 1.2.0 solo admiten UNION ALL y, en este caso, no se eliminarán las filas duplicadas.
2. Al usar la palabra clave ALL, las filas duplicadas no se eliminarán y el conjunto de resultados incluye todas las filas coincidentes de declaraciones seleccionadas (incluidas filas duplicadas)
3. El número y los nombres de las columnas devueltas por cada select_statement deben ser los mismos

select_statement
    UNION [ALL|DISTINCT]
select_statement
    UNION [ALL|DISTINCT]
select_statement...;
select num,name from student_local
union ALL
select num,name from student_hdfs;

select num,name from student_local
union DISTINCT
select num,name from student_hdfs;

-- 如果要将ORDER BY,SORT BY,CLUSTER BY,DISTRIBUTE BY或LIMIT应用于单个SELECT
-- 请将子句放在括住select的括号内
select num,name from (select num,name from student_local limit 2) subq1
union
select num,name from (select num.name from student_hdfs limit 3) subq2;
-- 如果放在最后,则是对联合后的表操作

Subconsultas en la cláusula from (Subconsultas)

  • En la versión 0.12 de Hive, las subconsultas solo se admiten en la cláusula FROM. La subconsulta debe recibir un nombre porque cada tabla en la cláusula from debe tener un nombre. Las columnas de los resultados devueltos por una subconsulta deben tener nombres únicos. Las columnas devueltas por la subconsulta están disponibles en la consulta externa al igual que las columnas de la tabla real. Una subconsulta también puede ser una expresión de consulta con UNION
  • Hive admite cualquier nivel de subconsultas, también conocidas como subconsultas anidadas
  • Los nombres de las subconsultas en Hive 0.13.0 y versiones posteriores pueden estar precedidos por la palabra clave opcional AS
  • A partir de Hiv0.13, la cláusula where admite los siguientes tipos de subconsultas
    • Subconsulta no correlacionada: esta subconsulta no hace referencia a las columnas de la consulta principal y los resultados de la consulta pueden ser constantes de declaraciones IN y NOT IN.
    • Subconsultas correlacionadas: las subconsultas se refieren a columnas en la consulta principal
-- from子句中子查询
-- 子查询
select num
from(
    select num,name from student_local
) tmp;

-- 包含UNION ALL的子查询示例
select t3.name
from(
    select num,name from student_local
    union all
    select num,name from student_hdfs
) t3;

-- where 子句中子查询
-- 不相关子查询,相当于IN、NOT IN子查询中鞥选择一个列
-- (1)执行子查询,其结果不被显示,而是传递给外部查询,作为外部查询的条件使用
-- (2)执行外部查询,并显示整个结果
select *
from student_hdfs
where student_hdfs.num IN (select num from student_local limit 2);

-- 相关子查询,指EXISTS 和 NOT EXISTS子查询
select A
from T1
where exists (select B from T2 where T1.X = T2.Y);

5.3.Expresiones de tabla comunes (CTE)

Introducción a los CTE

  • Una expresión común (CTE) es un conjunto de resultados temporal: el conjunto de resultados derivado de la consulta simple especificada en la cláusula WITH, inmediatamente antes de la palabra clave de selección o inserción
  • Los CTE solo se definen dentro del alcance de ejecución de una sola declaración
  • CTE se puede usar en select, insert, create table como select o create view como instrucciones select
[WITH CommentTableExpression (, CommentTableExpression)*]
SELECT ...;
-- select语句中的CTE
with q1 as (select num,name,age from student where num = 95002)
select *
from q1;

-- from风格
with q1 as (select num,name,age from student where num = 95002)
from q1
select *;

-- chaining CTEs链式
with q1 as (select num,name,age from student where num = 95002),
     q2 as (select num,name,age from q1)
select * from (select num from q2) a;

-- union
with q1 as (select * from student where num = 95002),
     q2 as (select * from student where num = 95004)
select * from q1 union all select * from q2;

-- 视图,CTAS和插入语句中的CTE
-- insert
create table s1 like student;

with q1 as (select * from where num=95002)
from q1
insert overwrite table s1
select *;

select * from s1;

-- ctas
create table s2 as
with q1 as (select * from student where num = 95002)
select * from q1;

-- view
create view v1 as
with q1 as (select * from student where num = 95002)
select * from q1;

select * from v1;

6. Operación Hive SQL Join

La sintaxis de combinación se utiliza para combinar datos de consulta de estas tablas de acuerdo con la relación entre las columnas en dos o más tablas. En
Hive 3.1.2, se admiten un total de 6 sintaxis de combinación: combinación interna (inner join), combinación izquierda ( unión izquierda) conexión), unión derecha (conexión derecha), unión exterior completa (conexión exterior completa), semiunión izquierda (hacer una conexión semiabierta), unión cruzada (conexión cruzada, también llamada producto cartesiano)

6.1 reglas de sintaxis de unión

unir reglas de sintaxis

  • table_reference: Es el nombre de la tabla utilizada en la consulta de combinación, y también puede ser un alias de subconsulta (el resultado de la consulta se utiliza como tabla para participar en la combinación)
  • table_factor: Igual que table_reference, es el nombre de la tabla utilizada en la consulta de conexión, o puede ser un alias de subconsulta
  • join_condition: condiciones asociadas a la consulta de unión, si necesita unirse a más de dos tablas, use la palabra clave AND
join_table:
  table_reference [INNER] JOIN table_factor [join_condition]
| table_reference {
   
   LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition
| table_reference LEFT SEMI JOIN table_reference join_condition
| table_reference CROSS JOIN table _reference [join_condition] (as of Hive1.0)

join_condition:
  ON expression

Unirse al enriquecimiento de sintaxis

  • La sintaxis de unión de Hive no ha sido rica desde que salió
  • A partir de Hive 0.13.0, se admite la notación de combinación implícita. Permita que la cláusula FROM se una a una lista de tablas separadas por comas, omitiendo la palabra clave JOIN
  • A partir de Hive 2.2.0, se admiten expresiones complejas en cláusulas ON y uniones desiguales.

6.2 Explicación detallada del método de unión en 6

Unirse a la preparación del entorno de consultas
Preparar 3 tablas y cargar datos en la tabla

-- table1:员工表
create table employee(
    id int,
    name string,
    deg string,
    salary int,
    dept string
) row format delimited
fields terminated by ',';

-- table2:员工家庭住址信息表
create table employee_address(
    id int,
    hno string,
    street string,
    city string
) row format delimited
fields terminated by ',';

-- table3:员工联系方式信息表
create table employee_connection(
    id int,
    phno string,
    email string
) row format delimited
fields terminated by ',';

unir internamente

  • La combinación interna es el tipo de combinación más común, también se denomina combinación normal, donde se puede omitir la combinación interna: combinación interna == combinación
  • Solo se dejarán los datos que coincidan con la condición de unión existente en ambas tablas que se están uniendo
-- 1.inner join
select e.id,e.name,e_a.city,e_a.street
from employee e inner join employee_address e_a
on e.id = e_a.id;

-- 等价于inner join = join
select e.id,e.name,e_a.city,e_a.street
from employee e join employee_address e_a
on e.id = e_a.id;

-- 等价于 隐式连接表达法
-- 等价于inner join = join
select e.id,e.name,e_a.city,e_a.street
from employee e ,employee_address e_a
on e.id = e_a.id;

unir a la izquierda

  • unión izquierda nombre chino conexión exterior izquierda o conexión izquierda
  • La unión izquierda se basa en todos los datos de la tabla de la izquierda y la derecha está asociada a ella; se devuelven todos los datos de la tabla de la izquierda, se devuelve la visualización de la tabla de la derecha y la visualización que no está conectada se devuelto como nulo
-- 2.left join
select e.id,e.name,e_conn.phno,e_conn.email
from employee e left join employee_connection e_conn
on e.id = e_conn.id;

-- 等价于left outer join
select e.id,e.name,e_conn.phno,e_conn.email
from employee e left outer join employee_connection e_conn
on e.id = e_conn.id;

unirse a la derecha

  • La unión derecha se llama conexión exterior derecha o conexión derecha en chino
  • La unión derecha se basa en todos los datos de la tabla derecha al conectarse, y la izquierda está asociada con ella; se devuelven todos los datos de la tabla derecha, se devuelve la visualización de la tabla izquierda y la visualización que no asociado se devuelve como nulo
-- 2.right join
select e.id,e.name,e_conn.phno,e_conn.email
from employee e right join employee_connection e_conn
on e.id = e_conn.id;

-- 等价于left outer join
select e.id,e.name,e_conn.phno,e_conn.email
from employee e right outer join employee_connection e_conn
on e.id = e_conn.id;

unión externa completa

  • La unión externa completa es equivalente a la unión completa, que se denomina unión externa completa o unión externa en chino
  • Contiene todas las filas de las tablas izquierda y derecha, independientemente de si hay filas coincidentes en la otra tabla
-- 4.full outer join
select e.id,e.name,e_a.city,e_a.street
from employee e full outer join employee_address e_a
on e.id = e_a.id;

-- 等价于
select e.id,e.name,e_a.city,e_a.street
from employee e full join employee_address e_a
on e.id = e_a.id;

semi unión izquierda conexión abierta mitad izquierda

  • La conexión semiabierta izquierda devolverá los registros de la tabla de la izquierda, siempre que los registros cumplan las condiciones de juicio en la instrucción on para la tabla de la derecha.
  • Desde el punto de vista del efecto, es un poco como una unión interna y solo devuelve el resultado de la tabla izquierda.
-- 5.left semi join
select *
from employee e left semi join employee_address e_addr
on e.id = e.addr;

-- 相当于inner join,但是只返回左表全部数据,只不过效率高一些
select *
from employee e inner join employee_address e_addr
on e.id = e.addr;

unión cruzada

  • Una unión cruzada devolverá el producto cartesiano de las dos tablas que se unen, y el número de filas devuelto es igual al producto del número de filas de las dos tablas. Para tablas grandes, utilice la unión cruzada con precaución.
  • La combinación cruzada definida en el estándar SQL es una combinación interna incondicional. Devuelve el producto cartesiano de dos tablas sin especificar una clave asociativa.
  • En la sintaxis de HiveSQL, la unión cruzada puede ir seguida de la cláusula where para el filtrado o el filtrado condicionado.
-- 6.cross join
-- 下列A、B、C执行结果相同,但是效率不一样
-- A:
select a.*,b.* from employee a.employee_addtess b where a.id=b.id;
-- B:
select * from employee a cross join employee_address b on a.id=b.id;
select * from employee a cross join employee_address b where a.id=b.id;
-- C:
select * from employee a inner join employee_address b on a.id=b.id;
-- 一般不建议使用方法A和B,因为如果有WHERE子句的话,往往会先生成两个表行数乘积的行的数据表然后根据where条件从中选择
-- 因此,如果两个需要求交集的表太大,将会非常非常慢,不建议使用

6.3 Precauciones para el uso de join

  1. Permite el uso de expresiones de unión complejas y admite uniones no equivalentes
select a.* from a join b on (a.id = b.id);
select a.* from a join b on (a.id = b.id and a.department = b.department);
select a.* from a left outer join b on (a.id <> b.id);
  1. Se pueden unir más de 2 tablas en la misma consulta
select a.val,b.val from a join b on (a.key = b.key1) join c on (c.key = b.key2);
  1. Hive convierte las uniones en varias tablas en un solo trabajo de MR si cada tabla usa las mismas columnas en la cláusula de unión
select a.val,b.val,c.val from a join b on (a.key = b.key1) join c on (c.key = b.key1);
  1. La última tabla en una combinación se transmite a través del reductor, donde otras tablas anteriores se almacenan en búfer, por lo que colocar las tablas grandes en último lugar ayuda a reducir la memoria requerida para almacenar datos en caché en la etapa del reductor.
  2. Al unirse, puede especificar la tabla que se transmitirá a través de la solicitud de sintaxis STREAMTABLE. Si se omite la sugerencia STREAMTABLE, Hive transmitirá la tabla más a la derecha
select /*+ STREAMTABLE(a) */ a.val,b.val,c.val from a join b on (a.key = b.key1) join c on (c.key = b.key1);
-- a,b,c三个表都在一个MR作业中连接,并且表b和c的键特定的值被缓冲在reducer的缓存中
-- 然后,对于从a中检索到的每一行,将使用缓冲的行来计算连接,如果省略STREAMTABLE提示,则Hive将流式传输最右边的表
  1. la unión se realiza antes de la condición WHERE
  2. Si todas menos una de las tablas que se unen son pequeñas, se puede realizar como un trabajo de solo mapa (unión de mapa)
select /*+ MAPJOIN(b)*/ a.key,a.value from a join b on a.key = b.key;
-- 不需要reducer,对于A的每个Mapper,B都会被完全读取,限制是不能执行FULL/RIGHT OUTER JOIN b

Supongo que te gusta

Origin blog.csdn.net/hutc_Alan/article/details/131481136
Recomendado
Clasificación