本章知识
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