《数据算法Hadoop/Spark》读书笔记2--map与flatMap、mapPartitions对比

    • 本章知识
    • 1 map与flatMap对比
    • 2 map与mapPartitions对比
    • 3 实验
      • 3.1 map
      • 3.2 flatMap
      • 3.3 mapPartitions
    • 4 附录

本章知识

spark中的共同点为Iterable中的每一项均为RDD

map 一RDD对一RDD
flatMap 输出为可迭代,一行可迭代成多个数据,
每一项迭代成为一个新的RDD,故课对应多RDD
mapPartitions 输入为整个partition,输入为可迭代
迭代的每一项为原来的每一行(每一个RDD)

1 mapflatMap对比

方法 map(Function f) flatMap(FlatMapFunction f)
返回类型 static JavaRDD static JavaRDD
内部function
返回类型
R call(T1 v1) java.util.Iterator call(T t)
返回RDD数目 与原RDD数目相同 0或多个RDD
Iterator中多个元素即为多个RDD)
描述 对原RDDLike的每一个项进行
function操作,并返回RDD,
该RDD的项的数目等于原项的数目
map后扁平化
一对一转换 一对多转换
联系 一对一场合同map

图解如下

《数据算法Hadoop/Spark》读书笔记2--map与flatMap、mapPartitions对比_第1张图片

2 mapmapPartitions对比

方法 map(Function f) mapPartitions(FlatMapFunction,R> f)
返回类型 static JavaRDD static JavaRDD
描述 操作每一行T

假设有n行,进行nmap
操作每一个区
所以输入为Iterator
迭代的每一项同map中的每一行T

假设共n行分布k个区,进行kmapPartitions
次数少于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() {                 
    @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)