spark RDD算子(四)之创建键值对RDD mapToPair,flatMapToPair
·
一、mapToPair
案例:
在项目中创建src同级目录in,并在此目录中创建sample.txt文件
sample.txt文件内容如下:
aa bb cc aa aa aa dd dd ee ee ee ee
ff aa bb zks
ee kks
ee zz zks
scala版本
scala是没有mapToPair函数的,scala版本只需要map就可以了
val conf = new SparkConf().setMaster("local[*]").setAppName("mapToPair")
val sc = new SparkContext(conf)
//将每一行的第一个单词作为键,1 作为value创建pairRDD
val lines = sc.textFile("in/sample.txt")
val pairs = lines.map(x=>(x.split(" ")(0),1))
pairs.collect.foreach(println)

Java版本
JavaRDD<String> lines = sc.textFile("in/sample.txt");
// mapToPair
JavaPairRDD<String, Integer> mapToPairRdd = lines.mapToPair(new PairFunction<String, String, Integer>() {
@Override
public Tuple2<String, Integer> call(String s) throws Exception {
String[] split = s.split(" ");
String key = split[0];
return new Tuple2<>(key, 1);
}
});
List<Tuple2<String, Integer>> collect = mapToPairRdd.collect();
for (Tuple2 tup2:
collect) {
System.out.println(tup2);
}

二、flatMapToPair
类似于xxx连接 mapToPair是一对一,一个元素返回一个元素,而flatMapToPair可以一个元素返回多个,相当于先flatMap,在mapToPair
scala版本
//flatMapToPair
//将每一个单词都分成键,1 作为value
val pairRdd = sc.textFile("in/sample.txt").flatMap(x=>x.split(" ")).map((_,1))
pairRdd.collect.foreach(println)
//等同于: pairRdd collect() foreach println

Java版本
// flatMapToPair
JavaPairRDD<String, Integer> flatMapToPairRdd = lines.flatMapToPair(new PairFlatMapFunction<String, String, Integer>() {
@Override
public Iterator<Tuple2<String, Integer>> call(String s) throws Exception {
List<Tuple2<String, Integer>> list = new ArrayList<>();
String[] split = s.split(" ");
for (int i = 0; i < split.length; i++) {
String key = split[i];
Tuple2<String, Integer> tup2 = new Tuple2<>(key, 1);
list.add(tup2);
}
return list.iterator();
}
});
List<Tuple2<String, Integer>> collect = flatMapToPairRdd.collect();
for (Tuple2<String,Integer> tup2:
collect) {
System.out.println("key:"+tup2._1+" value:"+tup2._2);
}

更多推荐
所有评论(0)