大数据Spark(六十七):Transformation转换算子distinct和mapValues

文章目录

Transformation转换算子distinct和mapValues

一、distinct

二、mapValues


Transformation转换算子distinct和mapValues

一、distinct

用于对RDD数据进行去重,返回一个新的RDD,返回RDD包含原始RDD中所有唯一元素。实际底层distinct的实现为map+reduceByKey+map实现。

Java代码:

java 复制代码
SparkConf conf = new SparkConf().setMaster("local").setAppName("DistinctTest");
JavaSparkContext sc = new JavaSparkContext(conf);

JavaRDD<String> rdd = sc.parallelize(Arrays.asList("a", "b", "c", "a", "b", "c"));

//如果手动实现去重:mapToPair+reduceByKey+map
JavaPairRDD<String, Integer> rdd1 = rdd.mapToPair(new PairFunction<String, String, Integer>() {
    @Override
    public Tuple2<String, Integer> call(String s) throws Exception {
        return new Tuple2<>(s, 1);
    }
});
JavaPairRDD<String, Integer> rdd2 = rdd1.reduceByKey(new Function2<Integer, Integer, Integer>() {
    @Override
    public Integer call(Integer v1, Integer v2) throws Exception {
        return v1 + v2;
    }
});

rdd2.map(new Function<Tuple2<String,Integer>, String>() {
    @Override
    public String call(Tuple2<String, Integer> v1) throws Exception {
        return v1._1;
    }
}).foreach(s->System.out.println(s));


//使用distinct算子去重,对源RDD去重后返回一个新的RDD
JavaRDD<String> distinct = rdd.distinct();
distinct.foreach(s->System.out.println(s));
sc.stop();

Scala代码:

Scala 复制代码
val conf = new SparkConf().setMaster("local").setAppName("DistinctTest")
val sc = new SparkContext(conf)

val rdd: RDD[String] = sc.parallelize(Array("a","b","c","a","b","c"))
//手动去重,map+reduceByKey+map
rdd.map((_,1))
 .reduceByKey(_+_)
 .map(t=>t._1)
 .foreach(println)

//使用distinct去重
rdd.distinct().foreach(println)

sc.stop()

二、mapValues

该函数对K,V格式RDD中的Value按照传入的函数做转换,返回是K,V格式的RDD,Value为新转换后的Value。

Java代码:

java 复制代码
SparkConf conf = new SparkConf().setMaster("local").setAppName("MapValuesTest");
JavaSparkContext sc = new JavaSparkContext(conf);

JavaPairRDD<String, Integer> pairRDD = sc.parallelizePairs(Arrays.asList(
        new Tuple2<String, Integer>("a", 1),
        new Tuple2<String, Integer>("b", 2),
        new Tuple2<String, Integer>("c", 3)
));

//mapValues算子,只对value进行操作,key保持不变
JavaPairRDD<String, Integer> result = pairRDD.mapValues(new Function<Integer, Integer>() {
    @Override
    public Integer call(Integer integer) throws Exception {
        return integer * 2;
    }
});

result.foreach(tp->System.out.println(tp));

sc.stop();

Scala代码:

Scala 复制代码
val conf = new SparkConf().setMaster("local").setAppName("MapValuesTest")
val sc = new SparkContext(conf)

val rdd: RDD[(String, Int)] = sc.parallelize(List(("a", 1), ("b", 2), ("c", 3)))
//mapValues:对rdd中value进行操作,key不变
rdd.mapValues(_ * 10)
  .foreach(println)

sc.stop()

此外,还有个flatMapValues算子,其与mapValues类似,只是mapValues一对一返回数据,而flatMapValues一对多返回数据。


  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨
相关推荐
琉璃色的星辉10 小时前
Flink-2.0.0在配置文件中修改.pid文件存储位置及其他默认参数
大数据·flink·环境配置·修改参数
大G的笔记本11 小时前
Redis 分布式锁如何保证同一时间只有一个客户端持有锁
数据库·redis·分布式
呆呆小金人11 小时前
SQL优化实战:从慢查询到高效查询
大数据·数据库·数据仓库·sql·数据库开发·etl·etl工程师
AI企微观察11 小时前
企业微信SCRM系统有什么作用,满足哪些功能?从获客到提效的功能适配逻辑
大数据·企业微信·scrm·企业微信scrm
Kay_Liang12 小时前
【Hive 踩坑实录】从元数据库初始化到 HiveServer2 启动的全流程问题解决
大数据·linux·hive·hadoop·笔记·mysql·ubuntu
IT学长编程13 小时前
计算机毕业设计 基于Python的电商用户行为分析系统 Django 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
大数据·hadoop·python·django·毕业设计·课程设计·电商用户行为分析系统
飞鱼&13 小时前
Kafka(文件)数据存储、清理机制、高性能设计
分布式·kafka
StarRocks_labs13 小时前
告别 Hadoop,拥抱 StarRocks!政采云数据平台升级之路
大数据·数据库·starrocks·hadoop·存算分离
Hello.Reader13 小时前
Flink DataStream API 基础构件DataStream × Partitioning × ProcessFunction
java·大数据·flink
wudl556613 小时前
Flink Keyed State 详解之五
大数据·flink