spark记录(4)spark算子之Action

Action类算子也是一类算子(函数)叫做行动算子,如foreach,collect,count等。Transformations类算子是延迟执行,Action类算子是触发执行。一个application应用程序中有几个Action类算子执行,就有几个job运行。

(1)reduce

reduce其实是讲RDD中的所有元素进行合并,当运行call方法时,会传入两个参数,在call方法中将两个参数合并后返回,而这个返回值回合一个新的RDD中的元素再次传入call方法中,继续合并,直到合并到只剩下一个元素时。

代码

    public static void reduce() {
        JavaRDD<String> rdd = jsc.textFile("words");
        String reduce = rdd.flatMap(new FlatMapFunction<String, String>() {

            private static final long serialVersionUID = 1L;

            @Override
            public Iterable<String> call(String a) throws Exception {
                return Arrays.asList(a.split(" "));
            }
        }).reduce(new Function2<String, String, String>() {
            
            private static final long serialVersionUID = 1L;

            @Override
            public String call(String a, String b) throws Exception {
                return a+"-->"+b;
            }
        });
        System.out.println(reduce);
        
    }

结果:

(2)collect()

 将计算的结果作为集合拉回到driver端,一般在使用过滤算子或者一些能返回少量数据集的算子后,将结果回收到Driver端打印显示。

分布式环境下尽量规避,如有其他需要,手动编写代码实现相应功能就好。

详情请参考:https://blog.csdn.net/Fortuna_i/article/details/80851775

代码:

    public static void collect() {
        JavaRDD<String> rdd = jsc.textFile("words");
        List<String> collect = rdd.flatMap(new FlatMapFunction<String, String>() {

            private static final long serialVersionUID = 1L;

            @Override
            public Iterable<String> call(String a) throws Exception {
                return Arrays.asList(a.split(" "));
            }
        }).collect();
        for (String string : collect) {
            System.out.println(string);
        }
    }

结果:

(3)take

返回一个包含数据集前n个元素的数组(从0下标到n-1下标的元素),不排序。

代码:

    public static void take() {
        JavaRDD<String> rdd = jsc.textFile("words");
        List<String> take = rdd.flatMap(new FlatMapFunction<String, String>() {

            private static final long serialVersionUID = 1L;

            @Override
            public Iterable<String> call(String a) throws Exception {
                return Arrays.asList(a.split(" "));
            }
        }).take(5);
        for (String string : take) {
            System.out.println(string);
        }
    }

结果:

(4)first

返回数据集的第一个元素(底层即是take(1))

代码:

    public static void first() {
        JavaRDD<String> rdd = jsc.textFile("words");
        String first = rdd.flatMap(new FlatMapFunction<String, String>() {

            private static final long serialVersionUID = 1L;

            @Override
            public Iterable<String> call(String a) throws Exception {
                return Arrays.asList(a.split(" "));
            }
        }).first();
        System.out.println(first);

    }

结果:

(5)takeSample(withReplacement, num, [seed])

对于一个数据集进行随机抽样,返回一个包含num个随机抽样元素的数组,withReplacement表示是否有放回抽样,参数seed指定生成随机数的种子。

该方法仅在预期结果数组很小的情况下使用,因为所有数据都被加载到driver端的内存中。

代码:

结果:

(6)count

返回数据集中元素个数,默认Long类型。

代码:

    public static void count() {
        JavaRDD<String> rdd = jsc.textFile("words");
        long count = rdd.flatMap(new FlatMapFunction<String, String>() {

            private static final long serialVersionUID = 1L;

            @Override
            public Iterable<String> call(String a) throws Exception {
                return Arrays.asList(a.split(" "));
            }
        }).count();
        System.out.println(count);
    }

结果:

 

猜你喜欢

转载自www.cnblogs.com/kpsmile/p/10440486.html
今日推荐