spark WordCount程序(java+scala)

注意:使用时请提前导入spark lib里的所有jar包

Java 程序:

package cn.spark.study;

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 org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;
import scala.Int;
import scala.Tuple2;

import java.util.Arrays;

public class WordCountCluster {
    public static void main(String[] args){
        SparkConf sparkConf= new SparkConf()
                .setAppName("WordCountCluster");

        // 创建JavaSparkContext上下文对象,spark程序的入口,初始化一些核心组件用于程序的运行
        // 2.实例化一个上下问对象
        JavaSparkContext javaSparkContext = new JavaSparkContext(sparkConf);

        //针对输入源(本地文件,hdfs文件),创建一个初始的RDD
        // 输入源中的数据会打散,分配到RDD的每个partition,从而形成一个初始的分布式数据集
        // 这里相当于返回一个 JavaRDD实例化对象
        final JavaRDD<String> lines = javaSparkContext.textFile("hdfs://spark1:9000/spark.txt");

        //对初始RDD进行transformation操作,也就是一些计算操作
        // 通常操作会通过创建function,并配合RDD的map、flatmap等算子来执行function
        // 如果比较简单,则创建指定Function的匿名类
        // 但是如果function比较复杂,则会单独创建一个类,作为实现这个function接口的类


        //先将每一行拆分成单个的单词
        // FlatMapFunction有两个泛型参数,分别代表了输入和输出类型
        //
        JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
            @Override
            public Iterable<String> call(String line) throws Exception {
                return Arrays.asList(line.split(" ")); // 返回一个list
            }
        });

        // 接着需要将每个单词,映射为(单词,1)的这种格式
        // 因为只有这样,后面才能根据单词作为key,来进行每个单词的出现
        // 将每个元素映射为一个(v1,v2)这样的tuple2类型的元素
        JavaPairRDD<String,Integer> pairs = words.mapToPair(new PairFunction<String, String, Integer>() {
            @Override
            public Tuple2<String, Integer> call(String word) throws Exception {
                return new Tuple2<String, Integer>(word,1);
            }
        });

        //接着,需要以单词作为key,统计每个单词出现的次数
        // 这里需要使用reduceByKey这个算子,对每个key对应的value,都进行reduce操作
        JavaPairRDD<String,Integer> wordCounts = pairs.reduceByKey(
                new Function2<Integer, Integer, Integer>() {
                    @Override
                    public Integer call(Integer v1, Integer v2) throws Exception {
                        return v1+v2;
                    }
                }
        );

        //接下来是action操作,之前的flatMap、mapToPair、reduceByKey都是transformation操作
        // 通过action中的foreach来触发程序的执行
        // 循环遍历每一个tupple
        wordCounts.foreach(new VoidFunction<Tuple2<String, Integer>>() {
            @Override
            public void call(Tuple2<String, Integer> wordCount) throws Exception {
                System.out.println(wordCount._1+" appeared "+wordCount._2+" times.");
            }
        });

        //关闭javasprkContext
        javaSparkContext.close();



    }
}

scala程序:

package cn.spark.study

import org.apache.spark.{SparkConf, SparkContext}

object WordCount {
  def main(args:Array[String]): Unit ={ // 主函数入口
    val conf = new SparkConf().setAppName("WordCount");
    val sc = new SparkContext(conf); // 创建上下文对象

    val lines = sc.textFile("hdfs://spark1:9000/spark.txt"); // 获取输入源文件对象,返回list,有好多行字符串
    val words = lines.flatMap{line=>line.split(" ")};// 返回的单词存到了list里
    val pairs = words.map{word=>(word,1)}; // 返回一个没有reduce的tuple list集合,


    // shuffle
    val wordCounts = pairs.reduceByKey{ _ + _}; // 返回一个reduce的tuple list集合,相同的key组合成一个key,value为累计相加之和

    wordCounts.foreach(wordCount => println(wordCount._1 + " appeared "+ wordCount._2 + " times"));
  }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值