刚开始接触Spark编程,以WordCount作为入门编程实例,WordCount是用于统计单词出现的次数。本文参考http://blog.csdn.net/gongpulin/article/details/51534754,不同的是本文以Java语言实现实例的编程实现。
a、案例分析
对于词频数统计,用 Spark 提供的算子来实现,我们首先需要将文本文件中的每一行转化成一个个的单词, 其次是对每一个出现的单词进行记一次数,最后就是把所有相同单词的计数相加得到最终的结果。
对于第一步我们自然的想到使用 flatMap 算子把一行文本 split 成多个单词,然后对于第二步我们需要使用 map 算子把单个的单词转化成一个有计数的 Key-Value 对,即 word -> (word,1). 对于最后一步统计相同单词的出现次数,我们需要使用 reduceByKey 算子把相同单词的计数相加得到最终结果。
b、编程实现
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 scala.Tuple2;
import scala.actors.threadpool.Arrays;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
/**
* Created by Administrator on 2017/10/30.
*/
public class WordCount {
private static final Pattern SPACE = Pattern.compile(" ");
public static void main(String[] args) throws Exception {
SparkConf conf =new SparkConf().setAppName("WordCount").setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf);
//数据内容
List<String> dataList = new ArrayList<String>();
dataList.add("one,one,two,hello,world");
dataList.add("hello,world,one,two,three");
JavaRDD<String> list1 = sc.parallelize(dataList);
//数据分片
JavaRDD<String> words = list1.flatMap(new FlatMapFunction<String, String>() {
@Override
public Iterable<String> call(String s) throws Exception {
return Arrays.asList(s.split(","));
}
});
//数据转化为 对
JavaPairRDD<String,Integer> wordsMap = words.mapToPair(new PairFunction<String, String, Integer>() {
@Override
public Tuple2<String, Integer> call(String s) throws Exception {
return new Tuple2(s,1);
}
});
//求和
JavaPairRDD<String,Integer> wordsReduce = wordsMap.reduceByKey(new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer arg0, Integer arg1) throws Exception {
return arg0 + arg1;
}
});
//将RDD类型转化为List类型
List<Tuple2<String, Integer>> output = wordsReduce.collect();
for (Tuple2<?, ?> tuple : output) {
System.out.println(tuple._1() + ": " + tuple._2());
}
sc.stop();
}
}
c、运行结果
结束语
通过本文,完成基于Java对WordCount简单实例的编程实现,理解每一句代码含义,打好基础。
由于时间仓促并且本人知识水平有限,如有遗漏甚至是错误的地方,希望各位朋友不吝赐教。有任何问题,都可以在文末留下您的评论,我会及时回复。