Función de ventana suplementaria de Hive

Función de ventana
1. Sintaxis de la función de ventana de Hive
La estructura de sintaxis de la función de ventana sobre () y sobre () función de ventana en Hive

Función de análisis sobre (partición por orden de nombre de columna por filas de nombre de columna entre la posición inicial y la posición final)

La función over () incluye tres funciones: incluyendo partición por nombre de columna, orden de clasificación por nombre de columna, filas de rango de ventana especificadas entre la posición inicial y la posición final. Cuando usamos la función de ventana over (), estas tres funciones en la función over () se pueden usar en combinación o no.

Si estas tres funciones no se utilizan en la función over (), el tamaño de la ventana es para todos los datos generados por la consulta, si se especifica la partición, el tamaño de la ventana es para los datos de cada partición.

Las tres funciones en la función over () explican el significado de
orden por
orden por, que está en la ventana.
Partición por
partición por puede entenderse como grupo por agrupación. Cuando se usa over (partición por nombre de columna) con la función de análisis, la función de análisis se calcula de acuerdo con los datos de cada grupo y cada grupo.
La posición inicial y la posición final
de las filas intermedias son el rango de ventana especificado, como la primera fila de la fila actual. Y este rango cambia con los datos. Cuando más (filas entre la posición inicial y la posición final) se empareja con la función de análisis, la función de análisis se calcula de acuerdo con este rango.
Descripción del rango de ventana:
El rango de ventana que usamos a menudo es FILAS ENTRE FILA PRECEDENTE Y ACTUAL SIN LÍMITES (desde el punto de inicio hasta la fila actual), y esta ventana se usa a menudo para calcular la acumulación.

PRECEDING: hacia adelante
SIGUIENTE: hacia atrás
FILA ACTUAL: fila actual
SIN LÍMITES: punto de inicio (generalmente combinado con PRECEDENTE, SIGUIENTE)
SIN LÍMITE PRECEDENTE indica la primera fila de la ventana (punto de inicio)
SIN LÍMITE SIGUIENTE: indica la última fila (punto final) de la ventana , por
ejemplo Diga:
FILAS ENTRE LA FILA PRECEDENTE Y ACTUAL SIN LÍMITES (representando desde el punto de inicio a la fila actual)
FILAS ENTRE 2 FILAS PRECEDENTES Y 1 SIGUIENTE (representando 2 filas adelante y 1 fila atrás)
FILAS ENTRE 2 FILAS PRECEDENTES Y 1 FILA ACTUAL (representando 2 filas hacia adelante A la fila actual)
FILAS ENTRE FILA ACTUAL Y SIGUIENTE SIN LÍMITES (que representan la fila actual hasta el punto final)
2. Funciones de análisis que se utilizan a menudo con over ():
2.1.
Promedio agregado (), suma (), máx () , min ()
2.2. La clase de rango
row_number () genera un número de incremento automático cuando se ordena por valor, y no se repetirá (como: 1, 2, 3, 4, 5, 6)
rank () genera un incremento automático número cuando se ordena por valor, y los valores son iguales Cuando
se repite el valor, habrá espacios (como: 1, 2, 3, 3, 3, 6 ) dense_rank () generará un número de incremento automático cuando ordenando por valor, y se repetirá cuando los valores sean iguales, y no se generarán espacios (como: 1, 2,

3, 3, 3, 4) 2.3. Otros
lag (nombre de la columna, el número de filas anteriores, [el valor predeterminado cuando el número de filas es nulo, no especifique nulo]), puede calcular el tiempo de la última compra del usuario o el tiempo de la próxima compra del usuario.
lead (nombre de columna, número de filas subsiguientes, [valor predeterminado cuando el número de filas es nulo, no especificado como nulo])
ntile (n) distribuye las filas en la partición ordenada al grupo de datos especificado, cada grupo tiene un número, El número comienza desde 1, y para cada fila, ntile devuelve el número del grupo al que pertenece la fila.
Caso 1:
1. Utilice la función over () para realizar estadísticas de datos, contar la información de cada usuario y el número total de datos en la tabla
2. Solicitar usuarios Enumere y cuente el número total de usuarios por día
3. Calcule el número total de usuarios con una puntuación superior a 80 desde el primer día hasta la
fecha actual ID de usuario puntuación
logday uid score

Descripción del campo:
Datos:

20201210,10001,84
20201210,10002,83
20201210,10003,86
20201211,10001,87
20201211,10002,65
20201211,10003,98
20201212,10001,67
20201212,10002,28
20201212,10003,89
20201213,10001,99
20201213,10002,55
20201213,10003,57

Crea una tabla e importa datos:

create table test_window
(day string,    
uid string, 
score int)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

#Descargar datos

load data local inpath '/export/data/hive/test_window.txt' into table test_window;

1. Utilice la función over () para las estadísticas de datos y cuente la información de cada usuario y el número total de datos en la tabla.

select *, count(uid) over() as total  from  test_window;

2. Solicite los detalles del usuario y cuente el número total de usuarios por día.

select  *,count(*) over(partition by logday)as day_total from  test_window;

3. Calcule el número total de usuarios con una puntuación superior a 80 desde el primer día hasta el presente.

select  *,count(*) over(order by logday rows between unbounded preceding and current row)as total from  test_window where score > 80;

Caso 2:
1. Consultar los clientes que compraron en abril de 2020 y el número total de personas
2. Consultar los detalles de compra
del cliente y el total de compra mensual 3. Consultar los detalles de compra del cliente y el monto total de compra de cada cliente hasta el momento
4. Consultar el cliente Hora de la última compra
5. Consultar la información del pedido del primer 20% del tiempo

Descripción del campo:
nombre de usuario fecha del pedido monto del pedido
nombre fecha del pedido costo

datos:

jack,2020-01-01,11
tony,2020-01-02,16
jack,2020-02-03,22
tony,2020-01-04,28
jack,2020-01-05,47
jack,2020-04-06,43
tony,2020-01-07,50
jack,2020-01-08,55
mart,2020-04-08,63
mart,2020-04-09,69
tom,2020-05-10,13
mart,2020-04-11,76
tom,2020-06-12,81
mart,2020-04-13,95

Crea una tabla e importa datos:

create table business
(
name string, 
orderdate string,
cost int
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

#Descargar datos

load  data local inpath "/export/data/hive/business.txt" into table business;

1. Consultar el número total de clientes que compraron en abril de 2020

select   *,count(*) over() as total  from  business  where substr(orderdate,1,7) = '2020-04';

2. Consultar los detalles de compra del cliente y el total de la compra mensual.

select *,sum(cost) over(partition by name,substr(orderdate,1,7)) total_amount
from business;

3. Consultar los detalles de compra del cliente y el monto total de la compra de cada cliente hasta el momento.

select *,sum(cost) over(partition by name order  by  orderdate 
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) total_amount
from business;

4. Consultar la hora de la última compra del cliente.

select name,orderdate,cost,lag(orderdate,1) over(partition by name order by orderdate) last_date
from business;

5. Consultar la información del pedido del primer 20% del tiempo

select  * 
from 
(select *,
ntile(5)over(order  by  orderdate)  group_num from  business) t 
where t. group_num = 1;

Caso tres:
1. La clasificación de desempeño del estudiante de cada materia (ya sea que esté empatada o no, y la clasificación vacante se logra de tres maneras)
2. Los 3 mejores estudiantes de cada asignatura

Descripción del campo:
nombre de las materias en el grado
Nombre de la puntuación de la materia

datos:

建胜	语文	87
建胜	数学	95
建胜	英语	68
班长	语文	94
班长	数学	56
班长	英语	84
副班长	语文	64
副班长	数学	86
副班长	英语	84
团支书	语文	65
团支书	数学	85
团支书	英语	78

Cree una tabla para importar datos:

create table score
(
name string,
subject string, 
score int
) row format delimited fields terminated by "\t";

#Descargar datos

load data local inpath '/export/data/hive/window_score.txt' into table window_score;

1. Clasificaciones de desempeño de los estudiantes de cada materia (estén empatadas o no, y se logran clasificaciones vacantes)

select  *,
row_number()over(partition by subject order by score desc) as rn,
rank()over(partition by subject order by score desc) as rk,
dense_rank()over(partition by subject order by score desc) as dr
from window_score;

2. Los 3 mejores alumnos de cada asignatura

select 
*
from 
(
select 
*,
row_number() over(partition by subject order by score desc) rmp
from window_score
) t
where t.rmp<=3;

Supongo que te gusta

Origin blog.csdn.net/xianyu120/article/details/114583183
Recomendado
Clasificación