数据文件示例分别代表(日期 温度 湿度)
2017-01-10 14:12:12 34 1
2017-02-10 14:12:12 37 11
2017-02-10 11:12:12 12 23
2017-01-12 04:12:12 35 34
2017-01-10 14:12:12 35 14
2017-02-14 14:12:12 4 1
2017-04-20 14:12:12 9 13
2017-04-10 11:12:12 4 14
2017-04-10 11:12:12 5 13
2017-05-01 14:12:12 3 14
2017-05-12 17:12:12 44 53
。。。。。。。。。
任务一:根据温度来排序,温度相同的按照湿度来排序
计算思路如下图
代码如下
SparkConf conf = new SparkConf() .setAppName("weatherJava") .setMaster("local[1]"); JavaSparkContext sc = new JavaSparkContext(conf); JavaRDD<String> lineRdd = sc.textFile("weather"); /** * 泛型解释 * String lineRdd中每一条元素的类型 * SortObj: 返回的Rdd的key的类型 * String: 返回的key的value */ JavaPairRDD<SortObj, String> pairRdd = lineRdd.mapToPair(new PairFunction<String, SortObj, String>() { @Override public Tuple2<SortObj, String> call(String log) throws Exception { //log lineRdd中每一条将记录 String[] arr = log.split(" "); Integer templarter = Integer.valueOf(arr[2]); Integer shidu = Integer.valueOf(arr[3]); SortObj sortObj = new SortObj(templarter, shidu); return new Tuple2<SortObj, String>(sortObj, log); } }); /** * 排序 */ JavaPairRDD<SortObj, String> sordRdd = pairRdd.sortByKey(); /** * 循环 */ sordRdd.foreach(new VoidFunction<Tuple2<SortObj, String>>() { @Override public void call(Tuple2<SortObj, String> t) throws Exception { System.out.println(t._2); } });
任务二:统计每一个月份中,温度最高的前两位
计算思路如下图
代码如下
public static void main(String[] args) { SparkConf conf = new SparkConf() .setAppName("weatherJava") .setMaster("local[1]"); JavaSparkContext sc = new JavaSparkContext(conf); JavaRDD<String> lineRdd = sc.textFile("weather"); /** *任务二 : 统计每一个月份中,温度最高的前两位 */ JavaPairRDD<String, Integer> mapRdd = lineRdd.mapToPair(new PairFunction<String, String, Integer>() { @Override public Tuple2<String, Integer> call(String log) throws Exception { String[] arr = log.split(" "); Integer templarter = Integer.valueOf(arr[2]); String data = arr[0].substring(0, 7); return new Tuple2<String, Integer>(data, templarter); } }); /** * 根据月份分组 */ JavaPairRDD<String, Iterable<Integer>> groupRdd2 = mapRdd.groupByKey(); /** * 后去每个月top 2 */ groupRdd2.mapToPair(new PairFunction<Tuple2<String, Iterable<Integer>>, String, Integer[]>() { @Override public Tuple2<String, Integer[]> call(Tuple2<String, Iterable<Integer>> list) throws Exception { /** * 创建长度为2的数据 */ Integer[] shidu = new Integer[2]; Iterator<Integer> iterator = list._2.iterator(); while (iterator.hasNext()) { Integer sd = iterator.next(); for (int i = 0; i < shidu.length; i++) { if (shidu[i] == null) { shidu[i] = sd; break; } else { if (shidu[i] < sd) { for (int j = shidu.length - 1; j > i; j--) { shidu[j] = shidu[j - 1]; } shidu[i] = sd; break; } } } } return new Tuple2(list._1, shidu); } }).foreach(new VoidFunction<Tuple2<String, Integer[]>>() { @Override public void call(Tuple2<String, Integer[]> res) throws Exception { System.out.println("data:"+res._1+"\tresult:"+res._2[0]+"\t"+res._2[1]); } }); sc.stop(); }
计算结果如下