大数据Spark(六十六):Transformation转换算子sample、sortBy和sortByKey

文章目录

Transformation转换算子sample、sortBy和sortByKey

一、sample

二、sortBy

三、sortByKey


Transformation转换算子sample、sortBy和sortByKey

一、sample

随机抽样算子,根据传进去的小数按比例进行有放回或者无放回的抽样,常用于数据预览、测试或处理大规模数据时的抽样分析。sample算子函数签名如下:

Scala 复制代码
def sample(
    withReplacement: Boolean,
    fraction: Double,
    seed: Long = Utils.random.nextLong
): RDD[T]
  • withReplacement:布尔值,表示抽样时是否采用有放回的方式。true 表示有放回抽样,即同一个元素可能被多次抽取;false 表示无放回抽样,每个元素最多被抽取一次。
  • fraction:表示抽样比例。对于无放回抽样,fraction 是期望抽取的样本占原始数据集的比例,取值范围为 [0, 1];对于有放回抽样,fraction 表示每个元素被抽取的期望次数,取值应大于等于 0。
  • seed:可选参数,表示随机数生成器的种子,指定种子可以确保每次抽样结果一致,便于调试和测试。

需求:对数据进行有放回抽样。

Java代码

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

//sample(withReplacement, fraction, seed), withReplacement表示是否放回,fraction表示采样比例,seed表示随机种子
sc.parallelize(Arrays.asList(1,2,3,4,5,6,7,8,9,10))
        .sample(false,0.5,10)
        .foreach(s -> System.out.println(s));
sc.stop();

Scala代码

Scala 复制代码
val conf = new SparkConf()
  .setMaster("local")
  .setAppName("SampleTest")
val sc = new SparkContext(conf)
//sample(withReplacement, fraction, seed),
//withReplacement表示是否放回,fraction表示抽样的比例,seed表示随机种子
sc.parallelize(1 to 10)
  .sample(false, 0.5,10)
  .foreach(println)
sc.stop()

二、sortBy

sortBy 对任意类型的RDD 中的元素按照指定的键进行排序,需要一个函数来提取排序键,并可以指定升序或降序,以及分区数。函数签名如下:

Scala 复制代码
def sortBy[K](
    f: (T) => K,
    ascending: Boolean = true,
    numPartitions: Int = this.partitions.length
)(implicit ord: Ordering[K], ctag: ClassTag[K]): RDD[T]
  • f:从 RDD 的元素中提取排序键的函数。
  • ascending:布尔值,表示是否按升序排序,默认为 true。
  • numPartitions:排序后 RDD 的分区数,默认为与原始 RDD 相同。

特别注意:Java API中K,V格式RDD没有sortBy操作。

案例:按照字符串长度降序排序。

Java代码:

java 复制代码
SparkConf conf = new SparkConf().setMaster("local").setAppName("SortByTest");
JavaSparkContext sc = new JavaSparkContext(conf);
sc.parallelize(Arrays.asList("zhangsan", "lisi", "wangwu", "maliu"))
        //sortBy:按照字符串长度进行排序
        .sortBy(new Function<String, Integer>() {
            @Override
            public Integer call(String s) throws Exception {
                return s.length();
            }
        },true,1)
        .foreach(s -> System.out.println(s ));
sc.stop();

Scala代码:

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

//sortBy(f, ascending, numPartitions)
//f表示排序的依据,ascending表示是否升序,numPartitions表示分区数
sc.parallelize(List("zhangsan","lisi","wangwu","maliu"))
  .sortBy(_.length)
  .foreach(println)

sc.stop()

三、sortByKey

sortByKey 专用于对键值对 RDD 的键进行排序,可以指定升序或降序,以及分区数。

案例:按照K,V数据中的key大小降序排序。

Java代码:

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

JavaPairRDD<Integer, String> rdd = sc.parallelizePairs(Arrays.asList(
        new Tuple2<Integer,String>(10, "zhangsan"),
        new Tuple2<Integer,String>(20, "lisi"),
        new Tuple2<Integer,String>(30, "wangwu"),
        new Tuple2<Integer,String>(40, "maliu")
));

//sortBy:按照字符串长度进行排序
//按照key进行排序,false降序排序
rdd.sortByKey(false).foreach(new VoidFunction<Tuple2<Integer,String>>() {
    @Override
    public void call(Tuple2<Integer, String> integerStringTuple2) throws Exception {
        System.out.println(integerStringTuple2);
    }
});

sc.stop();

Scala代码:

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

sc.parallelize(List(("a",1),("b",2),("c",3),("d",4)))
  //sortByKey(ascending, numPartitions)
  //ascending表示是否升序,numPartitions表示分区数
  .sortByKey(false)
  .foreach(println)

sc.stop()

  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨
相关推荐
武子康20 小时前
大数据-237 离线数仓 - Hive 广告业务实战:ODS→DWD 事件解析、广告明细与转化分析落地
大数据·后端·apache hive
大大大大晴天1 天前
Flink生产问题排障-Kryo serializer scala extensions are not available
大数据·flink
武子康3 天前
大数据-236 离线数仓 - 会员指标验证、DataX 导出与广告业务 ODS/DWD/ADS 全流程
大数据·后端·apache hive
肌肉娃子4 天前
20260227.spark.Spark 性能刺客:千万别在 for 循环里写 withColumn
spark
初次攀爬者4 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
武子康4 天前
大数据-235 离线数仓 - 实战:Flume+HDFS+Hive 搭建 ODS/DWD/DWS/ADS 会员分析链路
大数据·后端·apache hive
DianSan_ERP5 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
够快云库5 天前
能源行业非结构化数据治理实战:从数据沼泽到智能资产
大数据·人工智能·机器学习·企业文件安全
AI周红伟5 天前
周红伟:智能体全栈构建实操:OpenClaw部署+Agent Skills+Seedance+RAG从入门到实战
大数据·人工智能·大模型·智能体
B站计算机毕业设计超人5 天前
计算机毕业设计Django+Vue.js高考推荐系统 高考可视化 大数据毕业设计(源码+LW文档+PPT+详细讲解)
大数据·vue.js·hadoop·django·毕业设计·课程设计·推荐算法