Structured Streaming——WordCount

本文介绍如何使用Apache Spark的Streaming模块实现实时词频统计。通过读取Socket数据源,将接收到的文本数据流转换为单词,然后对每个单词进行分组并统计其出现次数,最终将结果输出到控制台。此示例适用于测试环境,了解实时数据处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.{DataFrame, SparkSession}

object WordCountDemo1 {
  def main(args: Array[String]): Unit = {
    Logger.getLogger("org").setLevel(Level.WARN)

    val spark = SparkSession.builder()
      .appName("WordCountDemo1")
      .master("local").getOrCreate()
    import spark.implicits._
    /**
      * Socket方式是最简单的数据输入源,本程序就是使用的这种方式,
      * 用户只需要指定"socket"形式并配置监听的IP和Port即可。
      * Socket方式Streaming是接收UTF8的text数据,并且这种方式最后只用于测试,不要用户端到端的项目中。
      */
    val lines: DataFrame = spark.readStream
      .format("socket")
      .option("host", "master")
      .option("port", "9999")
      .load()

    /**
      * 首先将接受到的数据流lines转换为String类型的序列;
      * 接着每一批数据都以空格分隔为独立的单词;
      * 最后再对每个单词进行分组并统计次数。
      */
    val words = lines.as[String].flatMap(_.split(" "))
    val wordCounts: DataFrame = words.groupBy("value").count()
    /**
      * 通过DataFrame对象的writeStream方法获取DataStreamWrite对象,DataStreamWrite类定义了一些数据输出的方式。
      * 本程序将数据输出到控制终端。
      * 注意:只有在调用start()方法后,才开始执行Streaming进程。
      * start()方法会返回一个StreamingQuery对象,用户可以使用该对象来管理Streaming进程。
      * 本程序中调用awaitTermination()方法阻塞接收所有数据。
      */
    val query = wordCounts.writeStream.outputMode("complete")
      .format("console").start()

    //注意:使用append这个输出模式时,不能用wordCounts
    //    val query = words.writeStream.outputMode("append")
    //      .format("console").start()

    query.awaitTermination()
  }
}

 

### 配置 Structured Streaming 编程实践环境的方法 为了有效配置 Structured Streaming 的编程实践环境,需准备必要的软件和技术栈。这通常涉及安装 Apache Spark 并设置开发工具来支持 Structured Streaming 应用程序的编写。 #### 安装 Java 或 Scala 开发包 (JDK/SDK) Structured Streaming 是基于 Apache Spark 构建的一部分,而 Spark 主要由 Scala 编写并依赖于 JVM 运行时环境。因此,在大多数情况下,需要先安装 JDK 来提供运行时支持[^1]。 #### 下载与安装 Apache Spark 访问官方下载页面获取最新版本的 Spark 发行版,并解压到本地文件系统中的合适位置。确保选择包含 Hadoop 版本的预编译二进制包以便简化部署过程[^2]。 #### 设置环境变量 为了让命令行能够识别 `spark-submit` 及其他相关指令,建议将 SPARK_HOME 添加至系统的 PATH 环境变量中。此外,还需定义 PYSPARK_PYTHON 指向 Python 解释器路径以启用 PySpark 支持[^3]。 ```bash export SPARK_HOME=/path/to/spark-directory export PATH=$PATH:$SPARK_HOME/bin export PYSPARK_PYTHON=python3 ``` #### 使用 IDE 创建项目结构 对于希望利用集成开发环境(IDE)辅助编码工作的开发者来说,可以考虑采用 IntelliJ IDEA 或者 PyCharm Professional Edition。这些工具有助于更高效地管理依赖项以及调试代码逻辑。 #### 测试 Structured Streaming 功能 完成上述准备工作之后,可以通过启动简单的 WordCount 类型的应用实例来进行验证测试: ```python from pyspark.sql import SparkSession from pyspark.sql.functions import explode, split if __name__ == "__main__": spark = SparkSession.builder \ .appName("StructuredNetworkWordCount") \ .getOrCreate() lines = spark.readStream.format('socket').option('host', 'localhost')\ .option('port', 9999).load() words = lines.select(explode(split(lines.value, " ")).alias("word")) wordCounts = words.groupBy("word").count() query = wordCounts.writeStream.outputMode('complete').format('console').start() query.awaitTermination() ``` 此段脚本展示了如何创建一个基本的数据流处理管道,它会监听指定端口上的输入文本并通过控制台输出单词频率统计结果[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值