Spark 词频统计

词频统计

# 读取文本文件
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())     # 统计总行数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值