刚刚学习spark,所以写个简单案列,来提升自己。
spark也会有类似于hadoop的mapreduce过程,用于数据的处理。
准备工作:先将一个写有单词的文本传上到hdfs。
函数解释:
1,flatMap:
flatmap与map类似,区别是原RDD中的元素经map处理后只能生成一个元素,而原RDD中的元素经flatmap处理后可生成多个元素来构建新RDD。返回的是一个迭代
我们也是通过这个函数将文本分割成一个,数组然后返回。
2,mapToPair:
注意它返回的数类型是:JavaPairRDD。
Spark为包含键值对类型的RDD提供了一些专有的操作。这些RDD被称为PairRDD mapToPair函数会对一个RDD中的每个元素调用f函数,其中原来RDD中的每一个元素都是T类型的,调用f函数后会进行一定的操作把每个元素都转换成一个<K2,V2>类型的对象,其中Tuple2为多元组
因为后面要对每个单词出现的次数进行统计,所以先在这里将每个单词作为key,value都设为1.
3,reduceByKey:
reduceByKey函数就是对元素为KV对的RDD中Key相同的元素的Value进行reduce,因此,Key相同的多个元素的值被reduce为一个值,然后与原RDD中的Key组成一个新的KV对。
这里就是接受到前面的mapToPair返回的结果要是有key是相同的,他们的value值就会相加,会合拼成一个key value。
最后通过saveAsTextFile方法将结果保存到hdfs上就可以了。
代码展示:
import java.util.Arrays;
import org.apache.spark.*;
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.*;
import scala.Tuple2;
public class Worldconut {
public static void main(String[] args) {
SparkConf conf = new SparkConf();
conf.set(“spark.testing.memory”, “2147480000”); // 因为jvm无法获得足够的资源 这串数字大于512
//System.out.println(“**“+conf);
System.out.println(“单词计数开始了。。。。。。。。。。。。。”);
JavaSparkContext sc = new JavaSparkContext(“local”, “First Spark App”, conf);
// System.out.println(conf+”***“);
String logFile = “hdfs://192.168.61.128:9000/spark001/wordcount.txt”; // Should
JavaRDD textFile = sc.textFile(logFile).cache();
//flatmap与map类似,区别是原RDD中的元素经map处理后只能生成一个元素,而原RDD中的元素经flatmap处理后可生成多个元素来构建新RDD。
//返回的是一个迭代
JavaRDD<String> words = textFile.flatMap(new FlatMapFunction<String, String>() {
public Iterable<String> call(String s) {
return Arrays.asList(s.split(" "));
}
});
//Spark为包含键值对类型的RDD提供了一些专有的操作。这些RDD被称为PairRDD
//mapToPair函数会对一个RDD中的每个元素调用f函数,其中原来RDD中的每一个元素都是T类型的,
//调用f函数后会进行一定的操作把每个元素都转换成一个<K2,V2>类型的对象
//Tuple2多元组
JavaPairRDD<String, Integer> pairs = words.mapToPair(new PairFunction<String, String, Integer>() {
public Tuple2<String, Integer> call(String s) {
return new Tuple2<String, Integer>(s, 1);
}
});
//reduceByKey就是对元素为KV对的RDD中Key相同的元素的Value进行reduce,
//因此,Key相同的多个元素的值被reduce为一个值,然后与原RDD中的Key组成一个新的KV对。
JavaPairRDD<String, Integer> counts = pairs.reduceByKey(new Function2<Integer, Integer, Integer>() {
public Integer call(Integer a, Integer b) {
return a + b;
}
});
//将结果直接写入到dfs上
counts.saveAsTextFile("hdfs://192.168.61.128:9000/sparksaveFile001/wordconunt/" + System.currentTimeMillis());
System.out.println("单词计数完成!!!!!!!!!!!!!!");
}
}