使用Java自动生成1000个人的年龄,存储至本地,数据格式如下:
左边一列为序号,右边为人的年龄.使用spark读取文件,并计算所有人的平均年龄:
第一种方法:
读入数据 --> 获取文件的第二列(年龄) --> 将年龄生成键值对(1 , age) --> 所有年龄相加(相加之后的数据仍然是键值对(1 , totalAge)),取value值 --> 计算结果.
代码如下:
/**
* 读入数据 --> split之后生成的是数组,取第1个 --> 生成键值对(new Tuple2)
* --> reduceByKey((x,y) -> x+y)之后仍然是键值对,通过values获取值totalAge
* --> totalAge仍然是RDD,将RDD转换为可访问的元素需要进行collect --> collect
* 之后的是List,获取List中的元素需要使用get(index) --> 计算结果.
*/
JavaRDD<String> data = sc.textFile("/home/greg/data/code/Java/SparkIDEA/src/resource/data.txt");
JavaRDD<String> age = data.map(line -> line.split(" ")[1]);
JavaPairRDD<Integer , Integer> agePair = age.mapToPair(line -> new Tuple2<>(1 , Integer.parseInt(line)));
JavaRDD<Integer> totalAge = agePair.reduceByKey((x , y) -> x + y).values();
System.out.println("person = " + data.count() + "\t" + "totalAge = " + totalAge.collect());
totalAge.collect().toArray();
System.out.println("ayerage age = " + (totalAge.collect().get(0) / data.count()));
第二种方法:
/**
* 读入数据 --> 获取文件的第二列并将其转换为Integer类型 --> 直接进行reduce((a,b) -> a+b)
* reduce返回Integer类型 --> 计算结果
*/
JavaRDD<String> data = sc.textFile("/home/greg/data/code/Java/SparkIDEA/src/resource/data.txt");
JavaRDD<Integer> age = data.map(line -> Integer.parseInt(line.split(" ")[1]));
Integer totalAge = age.reduce((a , b) -> a + b);
System.out.println("person = " + data.count() + "\t" + "totalAge = " + totalAge);
System.out.println("ayerage age = " + (totalAge / data.count()));
结果:
注意lambda表达式的写法.