import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
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 scala.Tuple2;
//案列 词频统计 统计data.txt中 各个单词出现的次数
public class RddFunc {
public static void fun_rdd(JavaSparkContext jsc) {
//确认输入文件所在地
String path = "f:/data.txt";
//读取文件中的信息 相当于把文件内容转换成Rdd
JavaRDD<String> textFilerdd = jsc.textFile(path);
//获取文件中的信息
List<String> aa = textFilerdd.collect();
//用flatmap算子 把里面的元素变成键值 值默认为1
JavaRDD<String> flatMap = textFilerdd.flatMap(f ->{
String[] split = f.split(" ");
/* 把数组变成容器,
* 容器再变成迭代器 */
List<String> asList = Arrays.asList(split);
return asList.iterator();
} );
/*mapTopair 在java中把string变成元组 相当spark中的map
* 第一个泛型是参数rdd里面的元素类型
* 第二个泛型是返回值:rdd里面的key
* 第三个泛型是返回值:rdd里面的value
* new PairFunction<T, K, V>
*/
//[(this,1), (is,1), (a,1), (book,1), (this,1), (is,1), (a,1), (book,1), (hadoop,1), (hive,1), (hbase,1), (hive,1), (hbase,1), (hadoop,1), (hbase,1), (spark,1), (sqoop,1)]
JavaPairRDD<String, Integer> mapToPair = flatMap.mapToPair(f -> new Tuple2<String,Integer>(f, 1));
// 调用 reducebykey算子 把上一步的结果 根据相同的键 把他的值给合并起来
JavaPairRDD<String, Integer> reduceByKey = mapToPair.reduceByKey((a,b)->a+b);
//把reducebykey的键值用maptopair算子反过来 然后用sortbykek算子排序
JavaPairRDD mapToPair2 = reduceByKey.mapToPair(f -> new Tuple2<Integer,String>(f._2,f._1));
JavaPairRDD <String,Integer>sortByKey = mapToPair2.sortByKey(false);
//把最后的结果再用 maptopair算子反过来
JavaPairRDD<String, Integer> mapToPair3 = sortByKey.mapToPair(f -> new Tuple2<String,Integer>(f._1,f._2));
System.out.println(mapToPair3.collect());
}
//第二种方法++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public static void main(String[] args) {
System.out.println("===Tom===");
System.setProperty("hadoop.home.hir", "F:/ruanjian/hadoop-2.7.2");
SparkConf conf = new SparkConf();
conf.setAppName("RddFunc");
conf.setMaster("local");
JavaSparkContext jsc = new JavaSparkContext(conf);
//fun_rdd(jsc);
fun_rdd1(jsc);
jsc.stop();
}
private static void fun_rdd1(JavaSparkContext jsc) {
String path = "f:/data.txt";
JavaRDD<String> textFile = jsc.textFile(path);
JavaRDD<String> flatMap = textFile.flatMap(f -> {
/* 把数组变成容器,
* 容器再变成迭代器 */
String[] split = f.split(" ");
List<String> asList = Arrays.asList(split);
return asList.iterator();
});
//这里用flatmap算子把元素变成元组
JavaPairRDD <String,Integer>mapToPair = flatMap.mapToPair(f -> new Tuple2<String,Integer>(f, 1));
//把元组里键相同的值给放在一起得到一个元组(string,iterator(a...b))
JavaPairRDD<String, Iterable<Integer>> groupByKey = mapToPair.groupByKey();
//把单词相同的值相加
JavaPairRDD<String, Integer> mapToPair2 = groupByKey.mapToPair(f -> {
String key = f._1;
//值是一个元组 拿出来 下面进行相加操作
Iterator<Integer> iterator = f._2.iterator();
int res = 0;
//使用迭代器
/*
* for (iterator.hasNext()){ Integer a = iterator.next; res+=a; }
*/
//使用加强for
for (Integer s : f._2) {
res+=s;
}
//这里可以直接换位键值
return new Tuple2(res, key);
});
//进行排序
JavaPairRDD<String, Integer> sortBy = mapToPair2.sortByKey(false);
//把键值换位
sortBy.mapToPair(f -> new Tuple2(f, 2));
System.out.println(mapToPair2.collect());
}
}