需求
利用sparksql读取data.csv文件,统计如下结果
1.统计每个姓氏以及人数,不考虑复姓
2.统计每个生肖以及人数
3.统计每个年龄段的人数,期望结果
年龄段 人数
1 - 10 xx
11 - 20 xx
21 - 30 xx
...
4.统计每个省份积分最高的前3个人
姓名 分数 省份 排名
data.csv文件:

1.统计每个姓氏以及人数,不考虑复姓
python
from pyspark.sql import SparkSession
if __name__ == '__main__':
spark = SparkSession.builder \
.appName("测试") \
.getOrCreate()
df = spark.read.option('header',True).csv('data.csv')
df.createTempView('t1')
#1.统计每个姓氏以及人数,不考虑复姓
#substring(name, 0, 1) 将从 name 字符串中
#提取从索引 0(包含)到索引 1(不包含)的子字符串,即第一个字符。
spark.sql('''
select substring(name,0,1) xing,count(*) cnt
from t1
group by substring(name,0,1)
''').show()

2.统计每个生肖以及人数
python
from pyspark.sql import SparkSession
if __name__ == '__main__':
spark = SparkSession.builder \
.appName("测试") \
.getOrCreate()
df = spark.read.option('header',True).csv('data.csv')
df.createTempView('t1')
def computer_animals(year):
arr = ['鼠','牛','虎','兔','龙','蛇','马','羊','猴','鸡','狗','猪']
return arr[(int(year)-4)%12]
#
# # #2.统计每个生肖以及人数
'''
使用spark.udf.register将Python函数computer_animals注册为Spark SQL的UDF(用户定义函数),以便在SQL查询中使用。
SQL查询首先从t1视图中提取每个人的生日年份(
这里通过substring(birthday,0,4)提取年份),然后使用注册的UDF computer_animals计算对应的生肖。
最后,按生肖分组并计算每个生肖的人数。查询结果通过.show()方法显示出来。
'''
spark.udf.register('computer_animals',computer_animals)
spark.sql('''
select computer_animals(substring(birthday,0,4)) animals,count(*) cnt
from t1
group by computer_animals(substring(birthday,0,4))
''').show()

3.统计每个年龄段的人数
python
from pyspark.sql import SparkSession
if __name__ == '__main__':
spark = SparkSession.builder \
.appName("测试") \
.getOrCreate()
df = spark.read.option('header',True).csv('data.csv')
df.createTempView('t1')
spark.sql('''
select case when age >= 20 and age <= 30 then '20-30'
when age >= 30 and age <= 40 then '30-40'
when age >= 40 and age <= 50 then '40-50'
else '60以上' end age2,count(*) cnt
from(
select 2024 - substring(birthday,0,4) age
from t1
)t2 group by
case when age >= 20 and age <= 30 then '20-30'
when age >= 30 and age <= 40 then '30-40'
when age >= 40 and age <= 50 then '40-50'
else '60以上' end
''').show()

4.统计每个省份积分最高的前3个人
python
from pyspark.sql import SparkSession
if __name__ == '__main__':
spark = SparkSession.builder \
.appName("测试") \
.getOrCreate()
df = spark.read.option('header',True).csv('data.csv')
df.createTempView('t1')
spark.sql("""
select name,score,provincename,rn
from(
select
name,score,provincename,row_number() over(partition by provincename order by score desc) rn
from t1 where provincename is not null
)t2 where rn <= 3
""").show(150)
spark.stop()
