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

本章知识

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

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

1 mapflatMap对比

方法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 mapmapPartitions对比

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

假设有n行,进行nmap
操作每一个区
所以输入为Iterator<T>
迭代的每一项同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<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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值