目录
题目要求
- 计算不同年级的学生数量
- 获取性别为女性并且年龄小于20的学生信息
- 获取姓氏为王姓的学生信息
准备数据
准备students.txt
将数据上传到hdfs上
实现代码
import re
from pyspark import SparkContext
sc = SparkContext()
# 1-读取hdfs的学生信息
rdd = sc.textFile("hdfs://node1:8020/data/students.txt")
rdd1 = rdd.map(lambda x : x.split(","))
# 1-todo: 计算不同年级的学生数量
rdd2 = rdd1.map(lambda x:(x[4],1))
rdd3 = rdd2.reduceByKey(lambda x,y:x+y)
# 2-todo: 获取性别为女性并且年龄小于20的学生信息
rdd5 = rdd1.filter(lambda x :(int(x[3]) < 20) & (x[2] == '女'))
# 3-todo: 获取姓氏为张姓的学生信息
rdd6= rdd1.filter(lambda x : x[1].startswith("张"))
rdd7= rdd1.filter(lambda x : re.match('^\w',x[1]).group() == '张')
# 查看数据
# res1 = rdd1.collect()
# print(res1)
#
# res2 = rdd2.collect()
# print(res2)
res3 = rdd3.collect()
print(res3)
print('--------------------------------')
res5 = rdd5.collect()
print(res5)
print('--------------------------------')
res6 = rdd6.collect()
print(res6)
print('--------------------------------')
res7 = rdd7.collect()
print(res7)
总结
Spark的RDD中API提供了丰富的转换操作,但是不直接支持SQL风格的like操作符.
- 使用Scala 的
startsWith
、endsWith
或contains
方法,或者使用 Python 的str.startswith
、str.endswith
或str.contains
方法。- 使用正则表达式:在
filter
转换中使用正则表达式来匹配模式。例如,使用 Scala 的rdd.filter(_.matches("pattern"))
或 Python 的rdd.filter(lambda x: re.match("pattern", x) is not None)
。