Extensión: función de ventanas_Capítulo 6

1. Descripción general
https://www.cnblogs.com/qiuting/p/7880500.html
Introducción:
La función de ventana se introdujo para mostrar tanto los datos antes de la agregación como los datos después de la agregación.
Funciones de agregación y ventanas
聚合函数是将多行变成一行,count,avg....
开窗函数是将一行变成多行;
Si desea mostrar otras columnas en la función de agregación, debe agregar las columnas al grupo por. La
función de ventana puede mostrar directamente toda la información sin usar group by
Clasificación de la función de ventana
1. 聚合开窗函数
聚合函数(列) OVER(选项)Las opciones aquí pueden ser cláusulas PARTITION BY, pero no cláusulas ORDER BY.
2. 排序开窗函数
排序函数(列) OVER(选项)Las opciones aquí pueden ser la cláusula ORDER BY u OVER (cláusula PARTITION BY la cláusula ORDER BY), pero 不可以是 PARTITION BY 子句.
2. Preparación

/ export / server / spark / bin / spark-shell --master spark: // node01: 7077, node02: 7077

clase de caso Puntaje (nombre: String, clazz: Int, puntaje: Int)

val scoreDF = spark.sparkContext.makeRDD (Array (
Score (“a1”, 1, 80),
Score (“a2”, 1, 78),
Score (“a3”, 1, 95),
Score (“a4”, 2, 74),
Puntuación ("a5", 2, 92),
Puntuación ("a6", 3, 99),
Puntuación ("a7", 3, 99),
Puntuación ("a8", 3, 45),
Puntuación ("A9", 3, 55),
Puntuación ("a10", 3, 78),
Puntuación ("a11", 3, 100)
) .toDF ("nombre", "clase", "puntuación")

scoreDF.createOrReplaceTempView ("puntuaciones")

scoreDF.show ()
± - ± ---- ± ---- +
| nombre | clase | puntaje |
± - ± ---- ± ---- +
| a1 | 1 | 80
El | a2 | 1 | 78
El | a3 | 1 | 95 |
El | a4 | 2 | 74
El | a5 | 2 | 92 |
El | a6 | 3 | 99
El | a7 | 3 | 99
El | a8 | 3 | 45 |
El | a9 | 3 | 55
El | a10 | 3 | 78
El | a11 | 3 | 100

3. Función de ventana agregada
Ejemplo 1 La
palabra clave OVER significa que la función agregada se considera como una función de ventana agregada en lugar de una función agregada.
El estándar SQL permite que todas las funciones agregadas se utilicen como funciones de ventanas agregadas.

spark.sql ("seleccione el recuento (nombre) de las puntuaciones"). muestre
spark.sql ("seleccione el nombre, clase, puntaje, recuento (nombre) sobre () name_count de los puntajes"). show

Los resultados de la consulta son los siguientes:

± - ± ---- ± ---- ± --------- +
| nombre | clase | puntaje | nombre_cuenta |
± - ± ---- ± ---- ± --------- +
| a1 | 1 | 80 11 |
El | a2 | 1 | 78 11 |
El | a3 | 1 | 95 | 11 |
El | a4 | 2 | 74 11 |
El | a5 | 2 | 92 | 11 |
El | a6 | 3 | 99 11 |
El | a7 | 3 | 99 11 |
El | a8 | 3 | 45 | 11 |
El | a9 | 3 | 55 11 |
El | a10 | 3 | 78 11 |
El | a11 | 3 | 100 11 |
± - ± ---- ± ---- ± --------- +

Ejemplo 2
También puede agregar opciones entre paréntesis después de la palabra clave OVER para cambiar el rango de ventana para realizar operaciones de agregación.
Si las opciones entre paréntesis después de la palabra clave OVER están vacías, la función de ventanas agregará todas las filas en el conjunto de resultados.
Después de la palabra clave OVER de la función de ventanas, la cláusula PARTITION BY se puede utilizar para definir la partición de la fila para el cálculo agregado. A diferencia de la cláusula GROUP BY, la partición creada por la cláusula PARTITION BY es independiente del conjunto de resultados. La partición creada es solo para cálculos agregados, y las particiones creadas por diferentes funciones de ventanas no se afectan entre sí.

La siguiente instrucción SQL se usa para mostrar el número de personas en cada grupo después de agrupar por clase:
OVER (PARTITION BY class) significa dividir el conjunto de resultados por clase y calcular el resultado de cálculo agregado del grupo al que pertenece la fila actual.
spark.sql ("seleccione el nombre, la clase, la puntuación, el recuento (nombre) sobre (partición por clase) name_count de las puntuaciones"). Los resultados de la
consulta muestran los siguientes:
± - ± ---- ± ---- ± - ------- +
| name | class | score | name_count |
± - ± ---- ± ---- ± --------- +
| a1 | 1 | 80 | 3 |
| A2 |. 1 | 78 |. 3 |
| A3 |. 1 | 95 |. 3 |
| A6. | 3 | 99 |. 6 |
| A7. | 3 | 99 |. 6 |
| A8. | 3 | 45 |. 6 |
| A9. | 3 | 55 | 6 |
| a10 | 3 | 78 | 6 |
| a11 | 3 | 100 | 6 |
| a4 | 2 | 74 | 2 |
| a5 | 2 | 92 | 2 |
± - ± ---- ± --- - ± --------- +
6.4. Función de ventana de
ordenación 6.4.1. ROW_NUMBER ordenación secuencial
row_number () over (ordenar por puntuación) como rownum significa ordenar en orden ascendente de puntuación y obtener el número de secuencia del resultado de clasificación
Nota: La
cláusula PARTITION BY utilizada en la función de ventana de clasificación debe colocarse antes de la cláusula ORDER BY.
● Ejemplo 1
spark.sql ("seleccione nombre, clase, puntaje, número_ fila () sobre (ordenar por puntaje) rango de puntajes"). Mostrar ()
± - ± ---- ± ---- ± - +
| nombre | clase | puntaje | rango |
± - ± ---- ± ---- ± - +
| a8 | 3 | 45 | 1 |
| a9 | 3 | 55 | 2 |
| a4 | 2 | 74 | 3 |
| A2 |. 1 | 78 |. 4 |
| AlO |. 3 | 78 |. 5 |
| A1 |. 1 | 80 |. 6 |
| A5 | 2 | 92 |. 7 |
| A3 |. 1 | 95 |. 8 |
| A6. | 3 | 99 | 9 |
| a7 | 3 | 99 | 10 |
| a11 | 3 | 100 | 11 |
± - ± ---- ± ---- ± - +
spark.sql ("seleccione nombre, clase, puntaje, número_ fila () sobre (partición por orden de clase por puntaje) rango de puntajes"). show ()
± - ± ---- ± ---- ± - +
| nombre | clase | puntaje | rango |
± - ± ---- ± ---- ± - +
| a2 | 1 | 78 1 |
El | a1 | 1 | 80 2 |
El | a3 | 1 | 95 | 3 |
El | a8 | 3 | 45 | 1 |
El | a9 | 3 | 55 2 |
El | a10 | 3 | 78 3 |
El | a6 | 3 | 99 4 |
El | a7 | 3 | 99 5 |
El | a11 | 3 | 100 6 |
El | a4 | 2 | 74 1 |
El | a5 | 2 | 92 | 2 |
± - ± ---- ± ---- ± - +

6.4.2 RANGO omitir la clasificación de
clasificación () sobre (ordenar por puntuación) como clasificación significa ordenar en orden ascendente de puntuación y obtener el número de clasificación del resultado de clasificación.
Los resultados de la clasificación obtenidos por esta función se pueden unir (primer empate / segundo empate). La clasificación después de la clasificación paralela será la clasificación paralela más el número de paralelos. En
pocas palabras, cada persona tiene solo una clasificación, y luego hay dos empatados primero En este caso, la persona que está detrás de los dos primeros lugares será el tercer lugar, es decir, no hay un segundo lugar, pero hay dos primeros lugares
● Ejemplo 2
spark.sql ("seleccione nombre, clase, puntaje , rango () sobre (ordenar por puntaje) rango de puntajes "). show ()
± - ± ---- ± ---- ± - +
| nombre | clase | puntaje | rango |
± - ± ---- ---- ± ± - +
|.. A8 | 3 | 45 | 1 |
. | A9 | 3 | 55 | 2 |
. | A4 | 2 | 74 | 3 |
.. | AlO | 3 | 78 | 4 |
. | A2 | 1 | 78 |. 4 |
| A1 |. 1 | 80 |. 6 |
| A5 | 2 | 92 |. 7 |
| A3 |. 1 | 95 |. 8 |
| A6. | 3 | 99 |. 9 |
| A7. | 3 | 99 |. 9 |
| A11 | 3 | 100 | 11 |
± - ± ---- ± ---- ± - +
spark.sql ("seleccione nombre, clase, puntaje, rango () sobre (partición por orden de clase por puntaje) rango de puntajes"). show ()
± - ± ---- ± ---- ± - +
| nombre | clase | puntaje | rango |
± - ± ---- ± ---- ± - +
| a2 | 1 | 78 1 |
El | a1 | 1 | 80 2 |
El | a3 | 1 | 95 | 3 |
El | a8 | 3 | 45 | 1 |
El | a9 | 3 | 55 2 |
El | a10 | 3 | 78 3 |
El | a6 | 3 | 99 4 |
El | a7 | 3 | 99 4 |
El | a11 | 3 | 100 6 |
El | a4 | 2 | 74 1 |
El | a5 | 2 | 92 | 2 |
± - ± ---- ± ---- ± - +

6.4.3 DENSE_RANK clasificación continua
dense_rank () over (ordenar por puntuación) como dense_rank significa ordenar en orden ascendente de puntuación y obtener el número de clasificación del resultado de clasificación.
La clasificación después de esta función es la clasificación paralela es la clasificación paralela más uno.
Simplemente diga que cada persona tiene una sola clasificación y luego hay dos primeros lugares paralelos. En este momento, la persona que está detrás de los dos primeros lugares será el segundo lugar. Es decir, dos primeros lugares, un segundo lugar
● Ejemplo 3
spark.sql ("seleccionar nombre, clase, puntaje, dense_rank () sobre (ordenar por puntaje) rango de puntajes"). Mostrar ()
± - ± - - ± ---- ± - +
| nombre | clase | puntaje | rango |
± - ± ---- ± ---- ± - +
| a8 | 3 | 45 | 1 |
| a9 | 3 | 55 | 2 |
| A4 | 2 | 74 |. 3 |
| A2 |. 1 | 78 |. 4 |
| AlO |. 3 | 78 |. 4 |
| A1 |. 1 | 80 |. 5 |
| A5 | 2 | 92 |. 6 |
| A3 | 1 | 95 | 7 |
| a6 | 3 | 99 | 8 |
| a7 | 3 | 99 | 8 |
| a11 | 3 | 100 | 9 |
± - ± ---- ± ---- ± - +
spark.sql ("seleccione nombre, clase, puntaje, dense_rank () sobre (partición por orden de clase por puntaje) rango de puntajes"). show ()
± - ± ---- ± ---- ± - +
| name | clase | puntaje | rango |
± - ± ---- ± ---- ± - +
| a2 | 1 | 78 1 |
El | a1 | 1 | 80 2 |
El | a3 | 1 | 95 | 3 |
El | a8 | 3 | 45 | 1 |
El | a9 | 3 | 55 2 |
El | a10 | 3 | 78 3 |
El | a6 | 3 | 99 4 |
El | a7 | 3 | 99 4 |
El | a11 | 3 | 100 5 |
El | a4 | 2 | 74 1 |
El | a5 | 2 | 92 | 2 |
± - ± ---- ± ---- ± - +

6.4.4 Clasificación del grupo NTILE [Comprensión]

ntile (6) encima (ordenar por puntaje) como ntile significa ordenar en orden ascendente de puntaje, luego 6 se divide en 6 grupos y se muestra el número de serie del grupo.
● Ejemplo 4
spark.sql ("seleccione nombre, clase, puntaje, ntile (6) sobre (ordenar por puntaje) rango de puntajes"). Mostrar ()
± - ± ---- ± ---- ± - +
| nombre | clase | puntaje | rango |
± - ± ---- ± ---- ± - +
| a8 | 3 | 45 | 1 |
| a9 | 3 | 55 | 1 |
| a4 | 2 | 74 | 2 |
| A2 |. 1 | 78 | 2 |
| AlO |. 3 | 78 |. 3 |
| A1 |. 1 | 80 |. 3 |
| A5 | 2 | 92 |. 4 |
| A3 |. 1 | 95 |. 4 |
| A6. | 3 | 99 | 5 |
| a7 | 3 | 99 | 5 |
| a11 | 3 | 100 | 6 |
± - ± ---- ± ---- ± - +
spark.sql (“seleccione nombre, clase, puntaje, ntile (6) sobre (partición por orden de clase por puntaje) rango de puntajes "). Mostrar ()
± - ± ---- ± ---- ± - +
| nombre | clase | puntaje | rango |
± - ± ---- ± ---- ± - +
| a2 | 1 | 78 1 |
| a1 | 1 | 80 2 |
| a3 | 1 | 95 | 3 |
| a8 | 3 | 45 | 1 |
| a9 | 3 | 55 2 |
| a10 | 3 | 78 3 |
| a6 | 3 | 99 4 |
| a7 | 3 | 99 5 |
| a11 | 3 | 100 6 |
| a4 | 2 | 74 1 |
| a5 | 2 | 92 | 2 |
± - ± ---- ± ---- ± - +

238 artículos originales publicados · elogiados 429 · 250,000 visitas

Supongo que te gusta

Origin blog.csdn.net/qq_45765882/article/details/105561733
Recomendado
Clasificación