3月20日

实现窗口实时数据统计程序

from pyspark import SparkContext
from pyspark.streaming import StreamingContext
from pyspark.streaming.state import StateSpec

# 初始化Spark Streaming上下文
sc = SparkContext(appName="SparkStreamingAdvanced")
ssc = StreamingContext(sc, batchDuration=5)  # 设置微批处理的时间间隔为5秒
ssc.checkpoint("checkpoint")  # 设置检查点目录,用于状态恢复

# 定义状态更新函数
def update_word_count(new_values, running_count):
    """
    状态管理:更新单词计数
    """
    if running_count is None:
        running_count = 0
    return sum(new_values, running_count)

# 创建一个DStream,从Socket接收数据
# 假设数据通过Socket发送到localhost的9999端口
lines = ssc.socketTextStream("localhost", 9999)

# 对接收到的每行数据进行处理
words = lines.flatMap(lambda line: line.split(" "))  # 将每行数据分割为单词
word_pairs = words.map(lambda word: (word, 1))  # 将单词映射为键值对 (word, 1)

# 使用状态管理更新单词计数
word_counts = word_pairs.updateStateByKey(update_word_count)

# 使用窗口操作统计过去30秒内的单词计数,窗口滑动间隔为10秒
windowed_word_counts = word_pairs.reduceByKeyAndWindow(
    lambda x, y: x + y,  # 窗口内数据的聚合函数
    lambda x, y: x - y,  # 窗口移除数据的聚合函数
    windowDuration=30,   # 窗口持续时间
    slideDuration=10     # 窗口滑动时间
)

# 打印状态管理和窗口操作的结果
word_counts.pprint()
windowed_word_counts.pprint()

# 启动StreamingContext
ssc.start()

# 等待程序运行
ssc.awaitTermination()

 

posted @ 2025-03-24 07:56  KuanDong24  阅读(7)  评论(0)    收藏  举报