Spark RDD文件词频统计

本文介绍如何使用Apache Spark Streaming处理文本文件,通过flatMap、map和reduceByKey操作统计单词频率。在本地模式下运行Spark应用程序,并展示如何配置Maven工程、构建Spark任务及输出结果。

一:准备sparkStreamingWordFrep.txt文本文件,内容如下:

this is a processing of the sparkStreaming data learn use I can process spark it big streming
data learn use I can process spark it big streming 
to want I can  data learn use I can process spark it big streming
 

二,搭建maven管理的工程

<properties>
        <scala.version>2.11.8</scala.version>
    </properties>

    <repositories>
        <repository>
            <id>repos</id>
            <name>Repository</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </repository>
        <repository>
            <id>scala-tools.org</id>
            <name>Scala-Tools Maven2 Repository</name>
            <url>http://scala-tools.org/repo-releases</url>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>repos</id>
            <name>Repository</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </pluginRepository>
        <pluginRepository>
            <id>scala-tools.org</id>
            <name>Scala-Tools Maven2 Repository</name>
            <url>http://scala-tools.org/repo-releases</url>
        </pluginRepository>
    </pluginRepositories>

    <dependencies>
        <dependency> <!-- Spark ,依赖的Scala版本为Scala 2.12.x版本 (View all targets) 否则会报错
                           java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)[Ljava/lang/Object; -->
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency> <!-- Spark -->
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.11</artifactId>
            <version>2.4.0</version>
        </dependency>
        <!-- 2.12.x需要与spark的2.12对应-->
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>${scala.version}</version>
        </dependency>
    </dependencies>

    <build>
        <sourceDirectory>src/main/scala</sourceDirectory>
        <testSourceDirectory>src/test/scala</testSourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.scala-tools</groupId>
                <artifactId>maven-scala-plugin</artifactId>
                <version>2.15.2</version>
                <executions>
                    <execution>
                        <id>scala-compile-first</id>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <configuration>
                            <includes>
                                <include>**/*.scala</include>
                            </includes>
                        </configuration>
                    </execution>
                    <execution>
                        <id>scala-test-compile</id>
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>org.jy.data.yh.bigdata.drools.scala.sparkstreaming.SparkStreamingWordFreq</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>org.jy.data.yh.bigdata.drools.scala.sparkstreaming.SparkStreamingWordFreq</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

三:完整代码如下

package org.jy.data.yh.bigdata.drools.scala.sparkstreaming
import org.apache.spark.{SparkConf, SparkContext}
/**
 *  Spark 文本单词的计数: 从文本中读取数据,利用空格进行数据切分后,按照<词,1>的key,value映射后,
  * 最终以key为reduce对象,整合每个单词出现的次数。
  * 
  * 利用flagMap以空格为切分将输入的文本映射为一个向量,之后用map将每个元素映射为(元素,词频)
  * 的二元组,最后以每个词元素为key 进行reduce合并操作,从而统计出每个单词出现的词频
  * (注:这一步是分散在集群当中的所有Worker中执行的,即每个Worker可能只计算了一小部分)
 *
 */
object SparkStreamingWordFreq {
    def main(args :Array[String]):Unit = {
      // 创建SparkConf对象
      val sparkConf = new SparkConf();
      sparkConf.setAppName("SparkStreamingWordFreq") // 设置应用名称,该名称在Spark Web Ui中显示
      sparkConf.setMaster("local[*]") // 设置本地模式
      // 创建SparkContext对象
      val sparkContext = new SparkContext(sparkConf);
      // 数据源为文本文件
      val txtFile = "D://jar/sparkStreamingWordFrep.txt"
      // 读取文本文件的内容
      val txtData = sparkContext.textFile(txtFile);
      // 缓存文本RDD
      txtData.cache()
      // 计数
      txtData.count()
      // 以空格分割进行词频统计
      val wcData = txtData.flatMap{line => line.split(" ")}
          .map(word => (word,1))
          .reduceByKey(_+_)
          // 汇总RDD信息并打印
      wcData.collect() // 返回一个数组
        .foreach(e=>{println(e)})
      sparkContext.stop()

    }
}

四,在IntelliJ IDEA中运行该程序,输出统计结果如下:

(learn,3)
(this,1)
(is,1)
(can,4)
(big,3)
(data,3)
(,1)
(want,1)
(it,3)
(spark,3)
(process,3)
(a,1)
(streming,3)
(processing,1)
(sparkStreaming,1)
(I,4)
(to,1)
(of,1)
(use,3)
(the,1)

利用Spark RDD实现词频统计并打包到Spark集群运行,可按以下步骤操作: ### 预备工作 启动集群的HDFS与Spark [^2]。 ### 新建Maven项目 在IntelliJ IDEA中新建Maven管理的Spark项目 [^2]。 ### 添加相关依赖和构建插件 为项目添加相关依赖,确保项目能正常使用Spark的功能 [^4]。 ### 创建日志属性文件 创建日志属性文件,用于配置日志输出等相关信息 [^1][^4]。 ### 创建词频统计单例对象 使用Scala语言编写Spark的WordCount程序,创建词频统计单例对象,利用Spark RDD的算子实现单词计数 [^2]。 ### 本地运行程序,查看结果 在本地运行编写好的程序,查看词频统计的结果,确保程序逻辑正确 [^4]。 ### 对程序代码进行解析 对编写的词频统计代码进行详细解析,理解每一步的操作和意义 [^4]。 ### 将Spark项目编译和打包 将编写好的Spark项目进行编译和打包,生成可执行的文件 [^1][^4]。 ### 将词频统计应用上传到虚拟机 把打包好的词频统计应用上传到虚拟机中 [^1][^4]。 ### 在集群上执行词频统计应用 - **提交应用程序到集群中运行** - **不带参数运行程序**:直接将应用程序提交到集群运行 [^1]。 - **查看HDFS的结果文件**:运行结束后,查看HDFS上存储的词频统计结果文件 [^1]。 - **带参数运行结果**:可以尝试带参数运行应用程序,观察不同参数下的运行结果 [^1]。 以下是一个简单的使用Scala语言编写的Spark RDD词频统计示例代码: ```scala import org.apache.spark.{SparkConf, SparkContext} object WordCount { def main(args: Array[String]): Unit = { // 创建SparkConf对象 val conf = new SparkConf().setAppName("WordCount").setMaster("local[*]") // 创建SparkContext对象 val sc = new SparkContext(conf) // 读取文本文件 val textFile = sc.textFile("path/to/your/text/file") // 对文本进行分词并统计词频 val wordCounts = textFile.flatMap(line => line.split(" ")) .map(word => (word, 1)) .reduceByKey(_ + _) // 输出结果 wordCounts.collect().foreach(println) // 停止SparkContext sc.stop() } } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值