本章知识
spark中的共同点为
Iterable中的每一项均为RDD
| map | 一RDD对一RDD |
|---|---|
| flatMap | 输出为可迭代,一行可迭代成多个数据,每一项迭代成为一个新的RDD,故课对应多RDD |
| mapPartitions | 输入为整个partition,输入为可迭代,迭代的每一项为原来的每一行(每一个RDD) |
1 map与flatMap对比
| 方法 | map(Function<T,R> f) | flatMap(FlatMapFunction<T,R> f) |
|---|---|---|
| 返回类型 | static <R> JavaRDD<R> | static <R> JavaRDD<R> |
内部function返回类型 | R call(T1 v1) | java.util.Iterator<R> call(T t) |
| 返回RDD数目 | 与原RDD数目相同 | 0或多个RDD ( Iterator中多个元素即为多个RDD) |
| 描述 | 对原RDDLike的每一个项进行function操作,并返回RDD, 该RDD的项的数目等于原项的数目 | 先map后扁平化 |
| 一对一转换 | 一对多转换 | |
| 联系 | 一对一场合同map |
图解如下

2 map与mapPartitions对比
| 方法 | map(Function<T,R> f) | mapPartitions(FlatMapFunction<Iterator<T>,R> f) |
|---|---|---|
| 返回类型 | static <R> JavaRDD<R> | static <R> JavaRDD<R> |
| 描述 | 操作每一行T假设有 n行,进行n次map | 操作每一个区 所以输入为 Iterator<T>迭代的每一项同map中的每一行 T假设共 n行分布k个区,进行k次mapPartitions次数少于map 自己实现迭代逻辑,每次迭代项同map中的每一行 |
3 实验
测试输入数据
1,2,3
44,55,66
3.1 map
JavaRDD<String> mapRes = lines.map(new Function<String, String>() {
@Override
public String call(String s) throws Exception {
String[] tokens = s.split(",");//1,2,3
return new Integer(tokens[0])*2 +","+ new Integer(tokens[1])*2+","+ new Integer(tokens[2])*2;
}
});
打印结果
mapRes.foreach(new VoidFunction<String>() {
@Override
public void call(String t) throws Exception {
System.out.println(t);//打印了两行,证明每一行是一个RDD
}
});
//结果
2,4,6
88,110,132
3.2 flatMap
JavaRDD<String> flatMapRes = lines.flatMap(new FlatMapFunction<String, String>() {
@Override
public Iterator<String> call(String s) throws Exception {
String[] tokens = s.split(",");//1,2,3
String[] r = new String[]{Integer.valueOf(tokens[0])*2+"",Integer.valueOf(tokens[1])*2+"",Integer.valueOf(tokens[2])*2+""};
return Arrays.asList(r).iterator();
}
});
flatMapRes 的结果多行证明迭代的每一项为一个RDD
2
4
6
88
110
132
3.3 mapPartitions
JavaRDD<String> mapPar = lines.mapPartitions(new FlatMapFunction<Iterator<String>, String>() {
@Override
public Iterator<String> call(Iterator<String> it) throws Exception {
List<String> list = new ArrayList();
//输入为iterable
//在这里并不会执行,因为单纯操作算法并不会执行
//System.out.println("打印mapPartitions接受的iterator数据,每行为一个it.next()");
//代码1:输入为整个partition,每一个iterator为每一行,不是行内
//每一行操作
while(it.hasNext()){
String s = it.next();
list.add(s+"test"); //每一行后边+test
//1,2,3test
//88,110,132test
}
//代码2:不用迭代不是处理的每一行,仅是第一个元素
//list.add(it.next()+"test");//仅第一个元素即第一行加test
//1,2,3test
return list.iterator();
}
});
4 附录
完整代码见github:
项目https://github.com/whbing/DataAlgorithmsHadoopSpark
中的src/main/java/cn/whbing/spark/dataalgorithms/chap02/TestMethod.java
本文深入探讨了Spark中三种核心的RDD转换操作:map、flatMap及mapPartitions的区别与联系。通过理论讲解与实例演示,清晰地展示了这三种操作在处理数据集时的特点与应用场景。
45

被折叠的 条评论
为什么被折叠?



