from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StringType, IntegerType, ArrayType
if __name__ == '__main__':
# 0.构建执行环境入口对象SparkSession
spark = SparkSession.builder.\
appName("test").\
master("local[*]").\
config("spark.sql.shuffle.partitions", 2).\
getOrCreate()
sc = spark.sparkContext
rdd = sc.parallelize([
('张三', 'class_1', 99),
('王五', 'class_2', 35),
('王三', 'class_3', 57),
('王久', 'class_4', 12),
('王丽', 'class_5', 99),
('王娟', 'class_1', 90),
('王军', 'class_2', 91),
('王俊', 'class_3', 33),
('王君', 'class_4', 55),
('王珺', 'class_5', 66),
('郑颖', 'class_1', 11),
('郑辉', 'class_2', 33),
('张丽', 'class_3', 36),
('张张', 'class_4', 79),
('黄凯', 'class_5', 90),
('黄开', 'class_1', 90),
('黄恺', 'class_2', 90),
('王凯', 'class_3', 11),
('王凯杰', 'class_1', 11),
('王开杰', 'class_2', 3),
('王景亮', 'class_3', 99)
])
schema = StructType()\
.add("name", StringType()). \
add("class", StringType()). \
add("score", IntegerType())
df = rdd.toDF(schema)
df.createTempView("stu")
spark.sql(""" SELECT *, avg(score) OVER() AS avg_score , max(score) OVER() AS max_score FROM stu """).show()
spark.sql("""
SELECT *, ROW_NUMBER() OVER(ORDER BY score DESC) AS row_number_rank,
DENSE_RANK() OVER( PARTITION BY class ORDER BY score DESC) AS dense_rank,
RANK() OVER(ORDER BY score DESC) AS rank
FROM stu
""").show()
spark.sql("""
SELECT *, NTILE(2) OVER(ORDER BY score DESC) FROM stu
""").show(100)
查看详情
+------+-------+-----+------------------+---------+
| name| class|score| avg_score|max_score|
+------+-------+-----+------------------+---------+
| 张三|class_1| 99|56.666666666666664| 99|
| 王五|class_2| 35|56.666666666666664| 99|
| 王三|class_3| 57|56.666666666666664| 99|
| 王久|class_4| 12|56.666666666666664| 99|
| 王丽|class_5| 99|56.666666666666664| 99|
| 王娟|class_1| 90|56.666666666666664| 99|
| 王军|class_2| 91|56.666666666666664| 99|
| 王俊|class_3| 33|56.666666666666664| 99|
| 王君|class_4| 55|56.666666666666664| 99|
| 王珺|class_5| 66|56.666666666666664| 99|
| 郑颖|class_1| 11|56.666666666666664| 99|
| 郑辉|class_2| 33|56.666666666666664| 99|
| 张丽|class_3| 36|56.666666666666664| 99|
| 张张|class_4| 79|56.666666666666664| 99|
| 黄凯|class_5| 90|56.666666666666664| 99|
| 黄开|class_1| 90|56.666666666666664| 99|
| 黄恺|class_2| 90|56.666666666666664| 99|
| 王凯|class_3| 11|56.666666666666664| 99|
|王凯杰|class_1| 11|56.666666666666664| 99|
|王开杰|class_2| 3|56.666666666666664| 99|
+------+-------+-----+------------------+---------+
only showing top 20 rows
+------+-------+-----+---------------+----------+----+
| name| class|score|row_number_rank|dense_rank|rank|
+------+-------+-----+---------------+----------+----+
| 张三|class_1| 99| 1| 1| 1|
| 王娟|class_1| 90| 5| 2| 5|
| 黄开|class_1| 90| 7| 2| 5|
| 郑颖|class_1| 11| 18| 3| 18|
|王凯杰|class_1| 11| 20| 3| 18|
| 王军|class_2| 91| 4| 1| 4|
| 黄恺|class_2| 90| 8| 2| 5|
| 王五|class_2| 35| 14| 3| 14|
| 郑辉|class_2| 33| 16| 4| 15|
|王开杰|class_2| 3| 21| 5| 21|
|王景亮|class_3| 99| 3| 1| 1|
| 王三|class_3| 57| 11| 2| 11|
| 张丽|class_3| 36| 13| 3| 13|
| 王俊|class_3| 33| 15| 4| 15|
| 王凯|class_3| 11| 19| 5| 18|
| 张张|class_4| 79| 9| 1| 9|
| 王君|class_4| 55| 12| 2| 12|
| 王久|class_4| 12| 17| 3| 17|
| 王丽|class_5| 99| 2| 1| 1|
| 黄凯|class_5| 90| 6| 2| 5|
+------+-------+-----+---------------+----------+----+
only showing top 20 rows
+------+-------+-----+-----------------------------------------------------------------------------------------------+
| name| class|score|ntile(2) OVER (ORDER BY score DESC NULLS LAST ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)|
+------+-------+-----+-----------------------------------------------------------------------------------------------+
| 张三|class_1| 99| 1|
| 王丽|class_5| 99| 1|
|王景亮|class_3| 99| 1|
| 王军|class_2| 91| 1|
| 王娟|class_1| 90| 1|
| 黄凯|class_5| 90| 1|
| 黄开|class_1| 90| 1|
| 黄恺|class_2| 90| 1|
| 张张|class_4| 79| 1|
| 王珺|class_5| 66| 1|
| 王三|class_3| 57| 1|
| 王君|class_4| 55| 2|
| 张丽|class_3| 36| 2|
| 王五|class_2| 35| 2|
| 王俊|class_3| 33| 2|
| 郑辉|class_2| 33| 2|
| 王久|class_4| 12| 2|
| 郑颖|class_1| 11| 2|
| 王凯|class_3| 11| 2|
|王凯杰|class_1| 11| 2|
|王开杰|class_2| 3| 2|
+------+-------+-----+-----------------------------------------------------------------------------------------------+