注意:使用时请提前导入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"));
}
}