词频统计
# 读取文本文件
rdd1 = sc.textFile('file:///usr/local/spark/licenses/LICENSE-py4j.txt')
# 查看原始数据
rdd1.foreach(print)
# 词频统计步骤
rdd2 = rdd1.map(lambda x: x.split(' ')) # 按空格分割每行
rdd2.foreach(print)
rdd3 = rdd1.flatMap(lambda x: x.split(' ')) # 扁平化所有单词
rdd3.foreach(print)
rdd4 = rdd3.map(lambda x: (x, 1)) # 转换为(单词, 1)键值对
rdd4.foreach(print)
rdd5 = rdd4.reduceByKey(lambda a, b: a + b) # 按单词聚合计数
rdd5.foreach(print)
rdd6 = rdd5.sortBy(lambda x: x[1], False) # 按词频降序排序
rdd6.foreach(print)
# 计算文档总词数(所有单词出现次数之和)
total_words = rdd6.map(lambda x: x[1]).sum()
print(f"文档总词数: {total_words}")
# 链式表达法(更简洁的实现)
total_words = (sc.textFile('file:///usr/local/spark/licenses/LICENSE-py4j.txt')
.flatMap(lambda x: x.split(' '))
.map(lambda x: (x, 1))
.reduceByKey(lambda a, b: a + b)
.sortBy(lambda x: x[1])
.map(lambda x: x[1])
.sum())
结构化数据处理
# 读取结构化文本文件
rdd1 = sc.textFile('file:///home/spark/mydata/test.txt')
# 查看原始数据
rdd1.foreach(print)
# 数据处理流程
rdd2 = rdd1.map(lambda x: x.split(' ')) # 分割每行数据
rdd2.foreach(print)
# 结构化转换(明确字段类型)
rdd3 = rdd2.map(lambda x: (
x[0], # id (字符串)
x[1], # name (字符串)
x[2], # age (字符串)
x[3], # gender (字符串)
x[4], # object (字符串)
int(x[5]) # score (整数)
))
rdd3.foreach(print)
# 查询特定字段(姓名和年龄)
rdd3.map(lambda x: (x[1], x[2])).foreach(print)
# 去重后查询年龄<20的记录数
young_count = (rdd3.map(lambda x: (x[1], x[2]))
.distinct()
.filter(lambda x: int(x[1]) < 20) # 确保年龄转换为整数
.count())
print(f"年龄小于20的独特记录数: {young_count}")
# 统计女性数量
female_count = (rdd3.map(lambda x: (x[1], x[3]))
.distinct()
.filter(lambda x: x[1] == '女')
.count())
print(f"女性记录数: {female_count}")
创建和操作 DataFrame
# 从RDD创建DataFrame
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("example").getOrCreate()
data = rdd3 # 使用前面处理好的结构化RDD
schema = ['id', 'name', 'age', 'gender', 'object', 'score']
df = spark.createDataFrame(data, schema)
# DataFrame基础操作
df.show() # 显示数据
df.printSchema() # 打印模式信息
print("列名:", df.columns) # 获取所有列名
print("列数据类型:", df.dtypes) # 获取列名和数据类型
# 数据查看方法
print("首条记录:", df.first()) # 获取第一条记录
print("前两条记录:", df.take(2)) # 获取前两条记录
df.foreach(print) # 遍历所有记录(谨慎使用)
print("总记录数:", df.count()) # 统计总行数

550

被折叠的 条评论
为什么被折叠?



