【Spark编程例题】单词计数与单词去重

题目

Spark编程

使用Spark编程实现:
(1)wordcount单词计数
(2)有一个文本文件test.txt,里面包含如下数据:

   apple,banana,lemen,orange,grape,pear,peach
   grape,pear,peach,strawberry,cherry
   apple,orange,grape
   strawberry,cherry,lemon
   orange,grape,pear,apple

要求:

  1. 找出包含apple的行
  2. 将包含apple的行按照“,”进行分割,得到一个列表集合
  3. 将集合中重复的单词去掉
  4. 将数据存储到本地主目录的 output 目录下

实现

该题,由于实在没能明白出题人的本意要如何,是计数后分割还是如何,因此干脆都写了,仅作参考。

代码实现1: 单词计数

package topic01;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import scala.Tuple2;

import java.util.Arrays;
import java.util.Properties;

public class topic01 {

    public static void main(String[] args) {

        // 配置 Hadoop 环境变量 使用 HDFS 时有效
        Properties properties = System.getProperties();
        properties.setProperty("HADOOP_USER_NAME", "root");

        // 创建SparkConf和JavaSparkContext
        SparkConf conf = new SparkConf();

        // 设置应用名称
        conf.setAppName("Topic01");

        // 设置运行模式
        // local:表示在本地单机上以单线程模式运行
        // local[*]:表示在本地单机上以多线程模式运行,线程数由系统自动决定
        // spark://HOST:PORT:表示连接到指定的 Spark 集群运行
        // mesos://HOST:PORT:表示连接到指定的 Mesos 集群运行
        // yarn:表示在 YARN 集群上运行
        conf.setMaster("local[*]");

        // 创建 JavaSpark 上下文对象
        JavaSparkContext sc = new JavaSparkContext(conf);

        // 读取文本文件 此处提供两种方式, 读取本地方式已被注释
        // JavaRDD<String> textFile = sc.textFile("test.txt"); // 读取本地文件
        JavaRDD<String> textFile = sc.textFile("hdfs://master1:9000/Tianxidev/word.txt"); // 读取 HDFS 文件系统

        // 将每一行按照逗号分割成一个字符串数组
        JavaRDD<String> words = textFile.flatMap(line -> Arrays.asList(line.split(",")).iterator());

        // 把每个单词映射为键值对 (word, 1)
        JavaPairRDD<String, Integer> wordOnes = words.mapToPair(word -> new Tuple2<>(word, 1));

        // 对相同键的值进行累加
        JavaPairRDD<String, Integer> wordCounts = wordOnes.reduceByKey((a, b) -> a + b);

        // 输出计数结果
        wordCounts.foreach(pair -> System.out.println(pair._1() + ": " + pair._2()));

        // 输出结果到本地主目录的 output 目录下
        wordCounts.saveAsTextFile("output"); // 输出本地
        wordCounts.saveAsTextFile("hdfs://master1:9000/Tianxidev/output"); // 输出 HDFS 文件系统

        // 停止 JavaSparkContext, 释放资源
        sc.stop();

    }

}

代码实现2: 分割去重

package topic02;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;

import java.util.Arrays;
import java.util.List;

public class topic02 {

    public static void main(String[] args) {

        // 创建SparkConf和JavaSparkContext
        SparkConf conf = new SparkConf();

        // 设置应用名称
        conf.setAppName("Topic02");

        // 设置运行模式
        // local:表示在本地单机上以单线程模式运行
        // local[*]:表示在本地单机上以多线程模式运行,线程数由系统自动决定
        // spark://HOST:PORT:表示连接到指定的 Spark 集群运行
        // mesos://HOST:PORT:表示连接到指定的 Mesos 集群运行
        // yarn:表示在 YARN 集群上运行
        conf.setMaster("local[*]");

        // 创建 JavaSpark 上下文对象
        JavaSparkContext sc = new JavaSparkContext(conf);

        // 读取文本文件 test.txt 文件内容如下注释
        // apple,banana,lemen,orange,grape,pear,peach
        // grape,pear,peach,strawberry,cherry
        // apple,orange,grape
        // strawberry,cherry,lemon
        // orange,grape,pear,apple
        JavaRDD<String> textFile = sc.textFile("test.txt");

        // 找出包含apple的行, line.contains 过滤掉不含 apple 的行
        JavaRDD<String> appleLines = textFile.filter(line -> line.contains("apple"));

        // 将包含apple的行按照 “,” 进行分割得到字符串数组
        JavaRDD<String[]> lists = appleLines.map(line -> line.split(","));

        // 将集合中重复的单词去掉
        JavaRDD<List<String>> words = lists.map(Arrays::asList).distinct();

        // 输出结果到本地主目录的output目录下
        words.saveAsTextFile("output");

        // 停止 JavaSparkContext, 释放资源
        sc.stop();

    }

}

代码实现3: 合并实现

public static void main(String[] args) {

        // 创建SparkConf和JavaSparkContext
        SparkConf conf = new SparkConf().setAppName("Word Count");
        JavaSparkContext sc = new JavaSparkContext(conf);

        // 读取文本文件
        JavaRDD<String> textFile = sc.textFile("test.txt");

        // 找出包含apple的行
        JavaRDD<String> appleLines = textFile.filter(line -> line.contains("apple"));

        // 将包含apple的行按照“,”进行分割,得到一个列表集合
        JavaRDD<String[]> lists = appleLines.map(line -> line.split(","));

        // 将集合中重复的单词去掉
        JavaRDD<List<String>> words = lists.map(Arrays::asList)
                .distinct();
        // 对单词进行计数
        JavaRDD<String> wordCounts = words.mapToPair(word -> new Tuple2<>(word, 1))
                .reduceByKey((a, b) -> a + b)
                .map(pair -> pair._1() + " " + pair._2());

        // 输出结果到本地主目录的output目录下
        wordCounts.saveAsTextFile("output");

        // 停止JavaSparkContext
        sc.stop();
    }
   
    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Terenna

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值