原理:
将存储字符串的普通RDD通过flatMap按照空格分割成单个的单词存储在新的RDD中,再将此RDD转化成PairRDD,单词作为键,而值全部设置为1.最后将所有键值对的value加起来,得到的数就是单词数量。
JavaRDD rdd = sc.parallelize(Arrays.asList("xiaobai is a big boss", "is it right", "sure you are right"));
//每个字符串以空格切割
JavaRDD rdd1 = rdd.flatMap(new FlatMapFunction() {
@Override
public Iterator call(String s) throws Exception {
return Arrays.asList(s.split(" ")).iterator();
}
});
JavaPairRDD count = rdd1.mapToPair(new PairFunction() {
@Override
public Tuple2 call(String s) throws Exception {
return new Tuple2(s, 1);
}
}).reduceByKey(new Function2() {
@Override
public Integer call(Integer integer, Integer integer2) throws Exception {
return integer + integer2;
}
});
执行结果:
当然,还有更加简便的方法去对每一个单词计数,上面只是为了演示键值对的使用。下面我们直接看最简单的每个单词计数
对一个RDD集合使用countByValue()方法,直接返回每个不同的对象及其数量组成的Map集合。
Mapnum=rdd.flatMap(new FlatMapFunction () { @Override public Iterator call(String s) throws Exception { return Arrays.asList(s.split(" ")).iterator(); } }).countByValue(); System.out.println(num);
结果如下:



