Spark的转换算子和操作算子

news2024/10/6 6:49:52

Transformation转换算子

1.1 Value类型

1)创建包名:com.shangjack.value

1.1.1 map()映射

参数f是一个函数可以写作匿名子类,它可以接收一个参数。当某个RDD执行map方法时,会遍历该RDD中的每一个数据项,并依次应用f函数,从而产生一个新的RDD。即,这个新RDD中的每一个元素都是原来RDD中每一个元素依次应用f函数而得到的。

1)具体实现

package com.shangjack.value;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import org.apache.spark.api.java.function.Function;

public class Test01_Map {

    public static void main(String[] args) {

        // 1.创建配置对象

        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        JavaRDD<String> lineRDD = sc.textFile("input/1.txt");

        // 需求:每行结尾拼接||

        // 两种写法  lambda表达式写法(匿名函数) 

        JavaRDD<String> mapRDD = lineRDD.map(s -> s + "||");

        // 匿名函数写法 

        JavaRDD<String> mapRDD1 = lineRDD.map(new Function<String, String>() {

            @Override

            public String call(String v1) throws Exception {

                return v1 + "||";

            }

        });

        for (String s : mapRDD.collect()) {

            System.out.println(s);

        }

        // 输出数据的函数写法

        mapRDD1.collect().forEach(a -> System.out.println(a));

        mapRDD1.collect().forEach(System.out::println);

        // 4. 关闭sc

        sc.stop();

    }

}

1.1.2 flatMap()扁平化

1)功能说明

与map操作类似,将RDD中的每一个元素通过应用f函数依次转换为新的元素,并封装到RDD中。

区别:在flatMap操作中,f函数的返回值是一个集合,并且会将每一个该集合中的元素拆分出来放到新的RDD中。

2)需求说明:创建一个集合,集合里面存储的还是子集合,把所有子集合中数据取出放入到一个大的集合中。

4)具体实现:

package com.shangjack.value;

import org.apache.commons.collections.ListUtils;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import org.apache.spark.api.java.function.FlatMapFunction;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Iterator;

import java.util.List;

public class Test02_FlatMap {

    public static void main(String[] args) {

        // 1.创建配置对象

        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        ArrayList<List<String>> arrayLists = new ArrayList<>();

        arrayLists.add(Arrays.asList("1","2","3"));

        arrayLists.add(Arrays.asList("4","5","6"));

        JavaRDD<List<String>> listJavaRDD = sc.parallelize(arrayLists,2);

        // 对于集合嵌套的RDD 可以将元素打散

        // 泛型为打散之后的元素类型

        JavaRDD<String> stringJavaRDD = listJavaRDD.flatMap(new FlatMapFunction<List<String>, String>() {

            @Override

            public Iterator<String> call(List<String> strings) throws Exception {

                return strings.iterator();

            }

        });

        stringJavaRDD. collect().forEach(System.out::println);

        // 通常情况下需要自己将元素转换为集合

        JavaRDD<String> lineRDD = sc.textFile("input/2.txt");

        JavaRDD<String> stringJavaRDD1 = lineRDD.flatMap(new FlatMapFunction<String, String>() {

            @Override

            public Iterator<String> call(String s) throws Exception {

                String[] s1 = s.split(" ");

                return Arrays.asList(s1).iterator();

            }

        });

        stringJavaRDD1. collect().forEach(System.out::println);

        // 4. 关闭sc

        sc.stop();

    }

}

1.1.3 groupBy()分组

1)功能说明:分组,按照传入函数的返回值进行分组。将相同的key对应的值放入一个迭代器。

2)需求说明:创建一个RDD,按照元素模以2的值进行分组。

3)具体实现

package com.shangjack.value;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaPairRDD;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import org.apache.spark.api.java.function.Function;

import java.util.Arrays;

public class Test03_GroupBy {

    public static void main(String[] args) {

        // 1.创建配置对象

        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        JavaRDD<Integer> integerJavaRDD = sc.parallelize(Arrays.asList(1, 2, 3, 4),2);

        // 泛型为分组标记的类型

        JavaPairRDD<Integer, Iterable<Integer>> groupByRDD = integerJavaRDD.groupBy(new Function<Integer, Integer>() {

            @Override

            public Integer call(Integer v1) throws Exception {

                return v1 % 2;

            }

        });

        groupByRDD.collect().forEach(System.out::println);

        // 类型可以任意修改

        JavaPairRDD<Boolean, Iterable<Integer>> groupByRDD1 = integerJavaRDD.groupBy(new Function<Integer, Boolean>() {

            @Override

            public Boolean call(Integer v1) throws Exception {

                return v1 % 2 == 0;

            }

        });

        groupByRDD1. collect().forEach(System.out::println);

Thread.sleep(600000);

        // 4. 关闭sc

        sc.stop();

    }

}

  • groupBy会存在shuffle过程
  • shuffle:将不同的分区数据进行打乱重组的过程
  • shuffle一定会落盘。可以在local模式下执行程序,通过4040看效果。

1.1.4 filter()过滤

1)功能说明

接收一个返回值为布尔类型的函数作为参数。当某个RDD调用filter方法时,会对该RDD中每一个元素应用f函数,如果返回值类型为true,则该元素会被添加到新的RDD中。

2)需求说明:创建一个RDD,过滤出对2取余等于0的数据

3)代码实现

package com.shangjack.value;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import org.apache.spark.api.java.function.Function;

import java.util.Arrays;

public class Test04_Filter {

    public static void main(String[] args) {

        // 1.创建配置对象

        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        JavaRDD<Integer> integerJavaRDD = sc.parallelize(Arrays.asList(1, 2, 3, 4),2);

        JavaRDD<Integer> filterRDD = integerJavaRDD.filter(new Function<Integer, Boolean>() {

            @Override

            public Boolean call(Integer v1) throws Exception {

                return v1 % 2 == 0;

            }

        });

        filterRDD. collect().forEach(System.out::println);

        // 4. 关闭sc

        sc.stop();

    }

}

1.1.5 distinct()去重

1)功能说明:对内部的元素去重,并将去重后的元素放到新的RDD中。

2)代码实现

package com.shangjack.value;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import java.util.Arrays;

public class Test05_Distinct {

    public static void main(String[] args) {

        // 1.创建配置对象

        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        JavaRDD<Integer> integerJavaRDD = sc.parallelize(Arrays.asList(1, 2, 3, 4, 5, 6), 2);

        // 底层使用分布式分组去重  所有速度比较慢,但是不会OOM

        JavaRDD<Integer> distinct = integerJavaRDD.distinct();

        distinct. collect().forEach(System.out::println);

        // 4. 关闭sc

        sc.stop();

    }

}

注意:distinct会存在shuffle过程

1.1.6 sortBy()排序

1)功能说明

该操作用于排序数据。在排序之前,可以将数据通过f函数进行处理,之后按照f函数处理的结果进行排序,默认为正序排列。排序后新产生的RDD的分区数与原RDD的分区数一致。Spark的排序结果是全局有序。

2)需求说明:创建一个RDD,按照数字大小分别实现正序和倒序排序

3)代码实现:

package com.shangjack.value;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import org.apache.spark.api.java.function.Function;

import java.util.Arrays;

public class Test6_SortBy {

    public static void main(String[] args) {

        // 1.创建配置对象

        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        JavaRDD<Integer> integerJavaRDD = sc.parallelize(Arrays.asList(5, 8, 1, 11, 20), 2);

        // (1)泛型为以谁作为标准排序  (2) true为正序  (3) 排序之后的分区个数

        JavaRDD<Integer> sortByRDD = integerJavaRDD.sortBy(new Function<Integer, Integer>() {

            @Override

            public Integer call(Integer v1) throws Exception {

                return v1;

            }

        }, true, 2);

        sortByRDD. collect().forEach(System.out::println);

        // 4. 关闭sc

        sc.stop();

    }

}

1.2 Key-Value类型

1)创建包名:com.shangjack.keyvalue

要想使用Key-Value类型的算子首先需要使用特定的方法转换为PairRDD

package com.shangjack.keyValue;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaPairRDD;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import org.apache.spark.api.java.function.PairFunction;

import scala.Tuple2;

import java.util.Arrays;

public class Test01_pairRDD{

    public static void main(String[] args) {

        // 1.创建配置对象

        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        JavaRDD<Integer> integerJavaRDD = sc.parallelize(Arrays.asList(1, 2, 3, 4),2);

        JavaPairRDD<Integer, Integer> pairRDD = integerJavaRDD.mapToPair(new PairFunction<Integer, Integer, Integer>() {

            @Override

            public Tuple2<Integer, Integer> call(Integer integer) throws Exception {

                return new Tuple2<>(integer, integer);

            }

        });

        pairRDD. collect().forEach(System.out::println);

        // 4. 关闭sc

        sc.stop();

    }

}

1.2.1 mapValues()只对V进行操作

1)功能说明:针对于(K,V)形式的类型只对V进行操作

2)需求说明:创建一个pairRDD,并将value添加字符串"|||"

4)代码实现:

package com.shangjack.keyValue;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaPairRDD;

import org.apache.spark.api.java.JavaSparkContext;

import org.apache.spark.api.java.function.Function;

import scala.Tuple2;

import java.util.Arrays;

public class Test02_MapValues {

    public static void main(String[] args) {

        // 1.创建配置对象

        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        JavaPairRDD<String, String> javaPairRDD = sc.parallelizePairs(Arrays.asList(new Tuple2<>("k", "v"), new Tuple2<>("k1", "v1"), new Tuple2<>("k2", "v2")));

        // 只修改value 不修改key

        JavaPairRDD<String, String> mapValuesRDD = javaPairRDD.mapValues(new Function<String, String>() {

            @Override

            public String call(String v1) throws Exception {

                return v1 + "|||";

            }

        });

        mapValuesRDD. collect().forEach(System.out::println);

        // 4. 关闭sc

        sc.stop();

    }

}

1.2.2 groupByKey()按照K重新分组

1)功能说明

groupByKey对每个key进行操作,但只生成一个seq,并不进行聚合。

该操作可以指定分区器或者分区数(默认使用HashPartitioner)

2)需求说明:统计单词出现次数

4)代码实现:

package com.shangjack.keyValue;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaPairRDD;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import org.apache.spark.api.java.function.Function;

import org.apache.spark.api.java.function.PairFunction;

import scala.Tuple2;

import java.util.Arrays;

public class Test03_GroupByKey {

    public static void main(String[] args) {

        // 1.创建配置对象

        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        JavaRDD<String> integerJavaRDD = sc.parallelize(Arrays.asList("hi","hi","hello","spark" ),2);

        // 统计单词出现次数

        JavaPairRDD<String, Integer> pairRDD = integerJavaRDD.mapToPair(new PairFunction<String, String, Integer>() {

            @Override

            public Tuple2<String, Integer> call(String s) throws Exception {

                return new Tuple2<>(s, 1);

            }

        });

        // 聚合相同的key

        JavaPairRDD<String, Iterable<Integer>> groupByKeyRDD = pairRDD.groupByKey();

        // 合并值

        JavaPairRDD<String, Integer> result = groupByKeyRDD.mapValues(new Function<Iterable<Integer>, Integer>() {

            @Override

            public Integer call(Iterable<Integer> v1) throws Exception {

                Integer sum = 0;

                for (Integer integer : v1) {

                    sum += integer;

                }

                return sum;

            }

        });

        result. collect().forEach(System.out::println);

        // 4. 关闭sc

        sc.stop();

    }

}}

1.2.3 reduceByKey()按照K聚合V

1)功能说明:该操作可以将RDD[K,V]中的元素按照相同的K对V进行聚合。其存在多种重载形式,还可以设置新RDD的分区数。

2)需求说明:统计单词出现次数

3)代码实现:

package com.shangjack.keyValue;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaPairRDD;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import org.apache.spark.api.java.function.Function;

import org.apache.spark.api.java.function.Function2;

import org.apache.spark.api.java.function.PairFunction;

import scala.Tuple2;

import java.util.Arrays;

public class Test04_ReduceByKey {

    public static void main(String[] args) {

        // 1.创建配置对象

        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        JavaRDD<String> integerJavaRDD = sc.parallelize(Arrays.asList("hi","hi","hello","spark" ),2);

        // 统计单词出现次数

        JavaPairRDD<String, Integer> pairRDD = integerJavaRDD.mapToPair(new PairFunction<String, String, Integer>() {

            @Override

            public Tuple2<String, Integer> call(String s) throws Exception {

                return new Tuple2<>(s, 1);

            }

        });

        // 聚合相同的key

        JavaPairRDD<String, Integer> result = pairRDD.reduceByKey(new Function2<Integer, Integer, Integer>() {

            @Override

            public Integer call(Integer v1, Integer v2) throws Exception {

                return v1 + v2;

            }

        });

        result. collect().forEach(System.out::println);

        // 4. 关闭sc

        sc.stop();

    }

}

1.2.4 reduceByKey和groupByKey区别

1)reduceByKey:按照key进行聚合,在shuffle之前有combine(预聚合)操作,返回结果是RDD[K,V]。

2)groupByKey:按照key进行分组,直接进行shuffle。

3)开发指导:在不影响业务逻辑的前提下,优先选用reduceByKey。求和操作不影响业务逻辑,求平均值影响业务逻辑。影响业务逻辑时建议先对数据类型进行转换再合并。

package com.shangjack.keyValue;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaPairRDD;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import org.apache.spark.api.java.function.Function;

import org.apache.spark.api.java.function.Function2;

import org.apache.spark.api.java.function.PairFunction;

import scala.Tuple2;

import java.util.Arrays;

public class Test06_ReduceByKeyAvg {

    public static void main(String[] args) throws InterruptedException {

        // 1.创建配置对象

        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        JavaPairRDD<String, Integer> javaPairRDD = sc.parallelizePairs(Arrays.asList(new Tuple2<>("hi", 96), new Tuple2<>("hi", 97), new Tuple2<>("hello", 95), new Tuple2<>("hello", 195)));

        // ("hi",(96,1))

        JavaPairRDD<String, Tuple2<Integer, Integer>> tuple2JavaPairRDD = javaPairRDD.mapValues(new Function<Integer, Tuple2<Integer, Integer>>() {

            @Override

            public Tuple2<Integer, Integer> call(Integer v1) throws Exception {

                return new Tuple2<>(v1, 1);

            }

        });

        // 聚合RDD

        JavaPairRDD<String, Tuple2<Integer, Integer>> reduceRDD = tuple2JavaPairRDD.reduceByKey(new Function2<Tuple2<Integer, Integer>, Tuple2<Integer, Integer>, Tuple2<Integer, Integer>>() {

            @Override

            public Tuple2<Integer, Integer> call(Tuple2<Integer, Integer> v1, Tuple2<Integer, Integer> v2) throws Exception {

                return new Tuple2<>(v1._1 + v2._1, v1._2 + v2._2);

            }

        });

        // 相除

        JavaPairRDD<String, Double> result = reduceRDD.mapValues(new Function<Tuple2<Integer, Integer>, Double>() {

            @Override

            public Double call(Tuple2<Integer, Integer> v1) throws Exception {

                return (new Double(v1._1) / v1._2);

            }

        });

        result. collect().forEach(System.out::println);

        // 4. 关闭sc

        sc.stop();

    }

}

1.2.5 sortByKey()按照K进行排序

1)功能说明

在一个(K,V)的RDD上调用,K必须实现Ordered接口,返回一个按照key进行排序的(K,V)的RDD

2)需求说明:创建一个pairRDD,按照key的正序和倒序进行排序

3)代码实现:

package com.shangjack.keyValue;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaPairRDD;

import org.apache.spark.api.java.JavaSparkContext;

import scala.Tuple2;

import java.util.Arrays;

public class Test05_SortByKey {

    public static void main(String[] args) {

        // 1.创建配置对象

        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        JavaPairRDD<Integer, String> javaPairRDD = sc.parallelizePairs(Arrays.asList(new Tuple2<>(4, "a"), new Tuple2<>(3, "c"), new Tuple2<>(2, "d")));

        // 填写布尔类型选择正序倒序

        JavaPairRDD<Integer, String> pairRDD = javaPairRDD.sortByKey(false);

        pairRDD. collect().forEach(System.out::println);

        // 4. 关闭sc

        sc.stop();

    }

}

2 Action行动算子

行动算子是触发了整个作业的执行。因为转换算子都是懒加载,并不会立即执行。

1)创建包名:com.shangjack.action

2.1 collect()以数组的形式返回数据集

1)功能说明:在驱动程序中,以数组Array的形式返回数据集的所有元素。

注意:所有的数据都会被拉取到Driver端,慎用

2)需求说明:创建一个RDD,并将RDD内容收集到Driver端打印

package com.shangjack.action;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import java.util.Arrays;

import java.util.List;

public class Test01_Collect {

    public static void main(String[] args) {

        // 1.创建配置对象

        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        JavaRDD<Integer> integerJavaRDD = sc.parallelize(Arrays.asList(1, 2, 3, 4),2);

        List<Integer> collect = integerJavaRDD.collect();

        for (Integer integer : collect) {

            System.out.println(integer);

        }

        // 4. 关闭sc

        sc.stop();

    }

}

2.2 count()返回RDD中元素个数

1)功能说明:返回RDD中元素的个数

3)需求说明:创建一个RDD,统计该RDD的条数

package com.shangjack.action;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import java.util.Arrays;

public class Test02_Count {

    public static void main(String[] args) {

        // 1.创建配置对象

        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        JavaRDD<Integer> integerJavaRDD = sc.parallelize(Arrays.asList(1, 2, 3, 4),2);

        long count = integerJavaRDD.count();

        System.out.println(count);

        // 4. 关闭sc

        sc.stop();

    }

}

2.3 first()返回RDD中的第一个元素

1)功能说明:返回RDD中的第一个元素

2)需求说明:创建一个RDD,返回该RDD中的第一个元素

package com.shangjack.action;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import java.util.Arrays;

public class Test03_First {

    public static void main(String[] args) {

        // 1.创建配置对象

        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        JavaRDD<Integer> integerJavaRDD = sc.parallelize(Arrays.asList(1, 2, 3, 4),2);

        Integer first = integerJavaRDD.first();

        System.out.println(first);

        // 4. 关闭sc

        sc.stop();

    }

}

2.4 take()返回由RDD前n个元素组成的数组

1)功能说明:返回一个由RDD的前n个元素组成的数组

2)需求说明:创建一个RDD,取出前两个元素

package com.shangjack.action;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import java.util.Arrays;

import java.util.List;

public class Test04_Take {

    public static void main(String[] args) {

        // 1.创建配置对象

        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        JavaRDD<Integer> integerJavaRDD = sc.parallelize(Arrays.asList(1, 2, 3, 4),2);

        List<Integer> list = integerJavaRDD.take(3);

        list.forEach(System.out::println);

        // 4. 关闭sc

        sc.stop();

    }

}

2.5 countByKey()统计每种key的个数

1)功能说明:统计每种key的个数

2)需求说明:创建一个PairRDD,统计每种key的个数

package com.shangjack.action;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaPairRDD;

import org.apache.spark.api.java.JavaSparkContext;

import scala.Tuple2;

import java.util.Arrays;

import java.util.Map;

public class Test05_CountByKey {

    public static void main(String[] args) {

        // 1.创建配置对象

        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        JavaPairRDD<String, Integer> pairRDD = sc.parallelizePairs(Arrays.asList(new Tuple2<>("a", 8), new Tuple2<>("b", 8), new Tuple2<>("a", 8), new Tuple2<>("d", 8)));

        Map<String, Long> map = pairRDD.countByKey();

        System.out.println(map);

        // 4. 关闭sc

        sc.stop();

    }

}

2.6 save相关算子

1)saveAsTextFile(path)保存成Text文件

功能说明:将数据集的元素以textfile的形式保存到HDFS文件系统或者其他支持的文件系统,对于每个元素,Spark将会调用toString方法,将它装换为文件中的文本

2)saveAsObjectFile(path) 序列化成对象保存到文件

功能说明:用于将RDD中的元素序列化成对象,存储到文件中。

3)代码实现

package com.shangjack.action;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaPairRDD;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import scala.Tuple2;

import java.util.Arrays;

public class Test06_Save {

    public static void main(String[] args) {

        // 1.创建配置对象

        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        JavaRDD<Integer> integerJavaRDD = sc.parallelize(Arrays.asList(1, 2, 3, 4),2);

        integerJavaRDD.saveAsTextFile("output");

        integerJavaRDD.saveAsObjectFile("output1");

        // 4. 关闭sc

        sc.stop();

    }

}

2.7 foreach()遍历RDD中每一个元素

2)需求说明:创建一个RDD,对每个元素进行打印

package com.shangjack.action;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import org.apache.spark.api.java.function.VoidFunction;

import java.util.Arrays;

public class Test07_Foreach {

    public static void main(String[] args) {

        // 1.创建配置对象

        SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore");

        // 2. 创建sparkContext

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        JavaRDD<Integer> integerJavaRDD = sc.parallelize(Arrays.asList(1, 2, 3, 4),4);

        integerJavaRDD.foreach(new VoidFunction<Integer>() {

            @Override

            public void call(Integer integer) throws Exception {

                System.out.println(integer);

            }

        });

        // 4. 关闭sc

        sc.stop();

    }

}

2.8 foreachPartition ()遍历RDD中每一个分区

package com.shangjack.spark.action;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import org.apache.spark.api.java.function.VoidFunction;

import java.util.Arrays;

import java.util.Iterator;

public class Test08_ForeachPartition {

    public static void main(String[] args) {

        // 1. 创建配置对象

        SparkConf conf = new SparkConf().setAppName("core").setMaster("local[*]");

        // 2. 创建sc环境

        JavaSparkContext sc = new JavaSparkContext(conf);

        // 3. 编写代码

        JavaRDD<Integer> parallelize = sc.parallelize(Arrays.asList(1, 2, 3, 4, 5, 6), 2);

        // 多线程一起计算   分区间无序  单个分区有序

        parallelize.foreachPartition(new VoidFunction<Iterator<Integer>>() {

            @Override

            public void call(Iterator<Integer> integerIterator) throws Exception {

                // 一次处理一个分区的数据

                while (integerIterator.hasNext()) {

                    Integer next = integerIterator.next();

                    System.out.println(next);

                }

            }

        });

        // 4. 关闭sc

        sc.stop();

    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1196786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中低收入群体能在“双十一”购物狂欢吗?

今天这个“双十一”购物狂欢节&#xff0c;在各大网站的报道的确蜂拥而上&#xff0c;显得很有点儿“狂欢”的景象&#xff0c;可读罢内容却听到哀鸿遍野。 笔者仅只接力“腾迅新闻”和“今日头条”几小时前分别发表的《 双11十五年&#xff0c;价格战还能打多久&#xff1f;》…

乡村振兴 品牌引领 “盘锦碱地柿子”亮相第二十届中国国际农产品交易会

2023年11月9日&#xff0c;为期4天的第二十届中国国际农产品交易会在山东青岛成功举办。本次大会以“奋进新征程强农促振兴”为主题。农交会是经党中央、国务院批准&#xff0c;农业农村部主办的大型农业行业盛会&#xff0c;在宣传“三农”政策、展示农业农村发展成就、活跃农…

58基于matlab的采样的运动规划算法-RRT(Rapidly-exploring Random Trees)

基于matlab的采样的运动规划算法-RRT(Rapidly-exploring Random Trees)&#xff0c;3D和2D,原始的RRT算法中将搜索的起点位置作为根节点&#xff0c;然后通过随机采样增加叶子节点的方式&#xff0c;生成一个随机扩展树&#xff0c;当随机树的叶子节点进入目标区域&#xff0c;…

一文带你了解栈的基本概念以及栈的实现

✏️✏️✏️今天给大家分享一下栈的基本概念、线性栈的自定义实现&#xff0c;以及栈的应用题目。 清风的CSDN博客 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01…

13. 高精度延时

13. 高精度延时 GPT 定时器简介GPT 定时器结构GPT 定时器工作模式 GPT 定时器相关寄存器GPTx_CRGPTx_PRGPTx_SRGPTx_CNTGPTx_OCR GPT 配置步骤程序编写bsp_delay.hbsp_delay.cmain GPT 定时器简介 GPT 定时器是一个 32 位向上定时器&#xff0c;也就是从0x00000000 开始向上递…

蓝桥杯算法竞赛第一周题型总结

本专栏内容为&#xff1a;蓝桥杯学习专栏&#xff0c;用于记录蓝桥杯的学习经验分享与总结。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f339;&#x1f33…

LCD1602设计(1)

本文为博主 日月同辉&#xff0c;与我共生&#xff0c;csdn原创首发。希望看完后能对你有所帮助&#xff0c;不足之处请指正&#xff01;一起交流学习&#xff0c;共同进步&#xff01; > 发布人&#xff1a;日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

【技术支持】DevTools中重写覆盖源js文件

sources面板下&#xff0c;左侧overrides标签下添加一个文件夹&#xff0c;并同意。 勾选Enable Local overrides 然后在page标签下&#xff0c;修改文件后ctrls保存 直接就保存在overrides的文件夹下了

FL Studio 21.2.0.3842中文破解版2024最新系统要求

FL Studio 21.2.0.3842中文版完整下载是最好的音乐开发和制作软件也称为水果循环。它是最受欢迎的工作室&#xff0c;因为它包含了一个主要的听觉工作场所。2024最新fl studioFL Studio 21版有不同的功能&#xff0c;如它包含图形和音乐音序器&#xff0c;帮助您使完美的配乐在…

颠覆人工智能计算硬件的新计算技术

颠覆人工智能计算硬件的新计算技术 图纸解释说明参考网址加法器模拟解析图纸 解释说明 简单的介绍 使用一个小的llm 模拟 计算最小单元加法器 等硬件 在使用 简单的 电阻矩阵模拟矩阵计算 固化llm 参数代替 半导体硬件 而后组成 大规模人工智能计算 参考网址 加法器 但是直接…

CMake教程--QT项目使用CMake

CMake教程--QT项目使用CMake Chapter1 CMake教程--QT项目使用CMake1. Basic Cmake Based Project2. Executable VS Library3. Every module has its own CMakeList.txt in its folder3.1 不推荐的做法&#xff1a;3.2 推荐的做法 4. 强制以Debug, Release, RelWithDebInfo, Min…

2024“点点点”测试员如何上岸测试开发岗?附完整学习路线

有很多人员会不断问自己&#xff0c;自己到底要不要学测试&#xff0c;或者要不要坚持做测试&#xff0c;测试的职业发展到底怎么样&#xff1f;如果你还在迷茫&#xff0c;在到处找各种大牛问类似的问题&#xff0c;我希望这篇文章&#xff0c;你看完能够结束你的这个烦恼&…

论文笔记:SimiDTR: Deep Trajectory Recovery with Enhanced Trajectory Similarity

DASFFA 2023 1 intro 1.1 背景 由于设备和环境的限制&#xff08;设备故障&#xff0c;信号缺失&#xff09;&#xff0c;许多轨迹以低采样率记录&#xff0c;或者存在缺失的位置&#xff0c;称为不完整轨迹 恢复不完整轨迹的缺失空间-时间点并降低它们的不确定性是非常重要…

Python进行多维数据分析

多维数据分析是对数据的信息分析&#xff0c;它考虑了许多关系。让我们来介绍一些使用Python分析多维/多变量数据的基本技术。 从这里找到用于说明的数据的链接。&#xff08;https://archive.ics.uci.edu/dataset/111/zoo&#xff09; 以下代码用于从zoo_data. csv读取2D表格…

无人机航迹规划:五种最新智能优化算法(GRO、SWO、COA、LSO、KOA)求解无人机路径规划MATLAB

一、五种算法&#xff08;GRO、SWO、COA、LSO、KOA&#xff09;简介 1、淘金优化算法GRO 淘金优化算法&#xff08;Gold rush optimizer&#xff0c;GRO&#xff09;由Kamran Zolf于2023年提出&#xff0c;其灵感来自淘金热&#xff0c;模拟淘金者进行黄金勘探行为。VRPTW&am…

2015年计网408

第33题 通过 POP3 协议接收邮件时, 使用的传输层服务类型是( ) A. 无连接不可靠的数据传输服务 B. 无连接可靠的数据传输服务 C. 有连接不可靠的数据传输服务 D. 有连接可靠的数据传输服务 本题考察邮件接收协议POP3使用的运输层服务类型。 如图所示。接收方用户代理使用pop…

Maven内网开发使用离线仓库

Maven内网开发使用离线仓库 离线或者内网环境开发与外网不通&#xff0c;中央仓库连不上&#xff0c;使用 Maven 管理项目会遇到很多问题。 比如&#xff1a;依赖包缺失&#xff0c;内网的Nexus私服的包老旧&#xff0c;很久没有维护&#xff0c;项目无法运行打包&#xff0c;…

pytorch中对nn.BatchNorm2d()函数的理解

pytorch中对BatchNorm2d函数的理解 简介计算3. Pytorch的nn.BatchNorm2d()函数4 代码示例 简介 机器学习中&#xff0c;进行模型训练之前&#xff0c;需对数据做归一化处理&#xff0c;使其分布一致。在深度神经网络训练过程中&#xff0c;通常一次训练是一个batch&#xff0c…

Dart笔记:一些代码生成工具站点的介绍

Dart笔记&#xff1a; 一些代码生成工具站点的介绍 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/1343…

Easyui DataGrid combobox联动下拉框内容

发票信息下拉框联动&#xff0c;更具不同的发票类型&#xff0c;显示不同的税率 专票 普票 下拉框选择事件 function onSelectType(rec){//选中值if (rec2){//普通发票对应税率pmsPlanList.pmsInvoiceTaxRatepmsPlanList.pmsInvoiceTaxRateT}else {//专用发票对应税率pmsPlan…