Spark RDD动作算子

|--------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 动作算子 | 介绍 |
| reduce(func) | 使用函数 func 对数据集中的元素进行聚合。该函数应当具备可交换性(如:a+b=b+a a-b!=b-a)和可结合性(a+b+c=a+(b+c)),以便能够正确地在并行环境下进行计算。 |
| collect() | 将数据集的所有元素作为一个数组返回给 Driver 程序。这通常在执行了过滤(filter)或其他操作,返回了一个足够小的数据子集之后使用。 测试环境,数据量不大可以使用,如果数据量过大或生产环境,不建议使用。 返回一个List<T> |
| count() | 返回dataset元素的数量。返回Long类型 |
| first() | 返回dataset第一个元素。类似于take(1) |
| take(n) | 返回一个包含数据集前 n 个元素的数组。 |
| takeSample(withReplacement, num, seed) | 返回一个包含数据集中 num 个随机元素的数组,支持设置是否放回抽样,并可选择性地预先指定随机数生成器的种子。 |
| takeOrdered(n, ordering) | 使用自然顺序或自定义比较器,返回 RDD 的前 n 个元素。 |
| saveAsTextFile(path) | 将数据集的元素写入给定目录下的文本文件(或一组文本文件),支持本地文件系统、HDFS 或任何其他 Hadoop 支持的文件系统。Spark 会调用每个元素的 toString 方法,将其转换为文件中的一行文本。如果是类的话,实现toString方法,且path是一个目录,如果目录存在会报错,不是文件名;且文件按分区生成多个具体文件 |
| saveAsSequenceFile(path) (Java and Scala) | 将数据集的元素以 Hadoop SequenceFile 的格式写入指定路径,支持本地文件系统、HDFS 或任何其他 Hadoop 支持的文件系统。此算子仅适用于由键值对组成的 RDD,且这些键值对必须实现 Hadoop 的 Writable 接口。在 Scala 中,该算子也适用于可以隐式转换为 Writable 的类型(Spark 已经内置了对 Int、Double、String 等基本类型的转换支持)。 版本暂时没有,存在saveAsHadoopFile |
| saveAsObjectFile(path) | 使用 Java 序列化机制,以简单的格式写入数据集的元素,随后可通过 SparkContext.objectFile() 进行加载。可以通过mapPartitionsRDD反序列化,或者mapPartitionsToPair。 |
| countByKey() | 仅适用于类型为 (K, V) 的 RDD。返回一个哈希映射(HashMap),其中包含每个键(Key)的计数,格式为 (K, Int) 键值对。 如:wordcount,可以不采用reduceByKey,直接在map(lambda x:(x,1)).countByKey()。返回key的类型+Long的Map Map<String,Integer> |
| foreach(func) | 在数据集的每个元素上运行函数 func。这通常用于产生副作用,例如更新累加器或与外部存储系统交互。 注意:在 foreach() 之外修改变量(累加器除外)可能会导致未定义的行为。 |

java 复制代码
// reduce
        JavaRDD<Integer> rdd = sc.parallelize(Arrays.asList(1,2,3,4,5,6));
        Integer result = rdd.reduce((a,b)->a+b);
        System.out.println(result);
输出:21
// collect 
        List<Integer> result = rdd.collect();
// count
        Long result = rdd.count();
// first  由于RDD类型为Integer,所以返回是Integer,如果是JavaRDD<String> 返回String
        Integer result =rdd.first();
// take(n)
        List<Integer> result = rdd.take(3);
// takeSample()
        List<Integer> result = rdd.takeSample(true,3,0);
// takeOrdered(num,ordering):降序
        List<Integer> result = rdd.takeOrdered(3, (o1, o2) -> o2.compareTo(o1));
// saveAsTextFile
        rdd.saveAsTextFile("test")
// saveAsHadoopFile
        JavaPairRDD<String,Integer> stuScore = sc.parallelizePairs(Arrays.asList(
                new Tuple2<>("Tom",611),
                new Tuple2<>("Jack",585),
                new Tuple2<>("Tom",585),
                new Tuple2<>("James",700)
                ));
        stuScore.saveAsHadoopFile("hdfs://master:9000/output/demo", Text.class, IntWritable.class, TextOutputFormat.class);
// saveAsObject
        JavaRDD<Employee> emps = sc.parallelize(Arrays.asList(
                new Employee(1,"tom",12),
                new Employee(2,"jack",22)

                ));
        emps.saveAsObjectFile("test01");
        JavaRDD<Employee> result = sc.objectFile("test01");
        JavaRDD<Tuple2<Integer, Tuple2<String, Integer>>> data = result.mapPartitions(new FlatMapFunction<Iterator<Employee>, Tuple2<Integer,Tuple2<String,Integer>>>() {
            @Override
            public Iterator<Tuple2<Integer, Tuple2<String, Integer>>> call(Iterator<Employee> employeeIterator) throws Exception {
                List<Tuple2<Integer,Tuple2<String,Integer>>> data = new ArrayList<>();
                while(employeeIterator.hasNext()){
                    Employee e = employeeIterator.next();
                    data.add(new Tuple2<Integer,Tuple2<String,Integer>>(e.getId(),new Tuple2<String,Integer>(e.getName(),e.getAge())));
                };
                return data.iterator();
            }
        });
        data.foreach(x-> System.out.println(x));
// countByKey
        Map<String,Long> result = stuScore.countByKey();
python 复制代码
# reduce:此外reduce支持最大最小值max/min函数
    rdd = sc.parallelize([1,2,3,4,5,6])
    print(rdd.reduce(lambda a,b:a+b))
    rdd = sc.parallelize([("tom",12),("jack",13)])
    print(rdd.reduce(lambda a, b: a[1] + b[1]))
# collect
    print(rdd.collect())
# count 
    print(rdd.count())
# first
    print(rdd.first())
# take
    print(rdd.take(3))
# takeSample
    print(rdd.takeSample(True,3))
# takeOrder (num,key=None) 降序 -x
    print(rdd.takeOrdered(3,lambda x:-x))
# saveAsTextFile
    rdd.saveAsTextFile("test")
相关推荐
BYSJMG1 天前
计算机毕设选题推荐:基于大数据的公共交通运营数据分析与可视化,Spark+K-Means聚类城市运营模式
大数据·hadoop·信息可视化·数据分析·spark·kmeans·课程设计
绿算技术2 天前
Solidigm联合绿算技术共同发布《面向 SOHO AI 推理的存储扩展方案》技术白皮书
人工智能·科技·算法·架构·spark
阿里云大数据AI技术2 天前
EMR Serverless Spark:CPU + GPU 异构计算使用指南
人工智能·spark·gpu
BYSJMG3 天前
计算机毕设选题做什么好?基于大数据的用户美食数据分析与可视化,PySpark预处理+ECharts大屏,含Isolation Forest异常检测算法
大数据·python·信息可视化·数据分析·spark·课程设计·美食
2601_962295993 天前
Spark 和 Kafka 实现 Python 大规模情感分析
python·spark·kafka·情感分析·大规模处理
fastjson_3 天前
Spark 安装和使用
大数据·分布式·spark
计算机源码社3 天前
分享一个基于大数据的跨平台内容生态画像与互动等级分析系统,基于Hadoop+Spark的社交媒体互动数据可视化大屏分析
大数据·hadoop·python·机器学习·数据挖掘·spark·毕业设计
BYSJMG3 天前
计算机毕设选题做什么好?基于大数据的用户健身行为数据分析与可视化系统,Hadoop+Spark处理
大数据·人工智能·hadoop·数据分析·spark·课程设计
2601_962298094 天前
零基础学大数据分析全栈
hadoop·python·spark·实战·大数据分析
用户3610588626125 天前
SparkStreaming 之 Kafka 与 SparkStreaming 参数配置详解
大数据·spark