当前位置: 首页 > news >正文

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

文章目录

Transformation转换算子sample、sortBy和sortByKey

一、sample

二、sortBy

三、sortByKey


Transformation转换算子sample、sortBy和sortByKey

一、sample

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

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

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

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代码

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 中的元素按照指定的键进行排序,需要一个函数来提取排序键,并可以指定升序或降序,以及分区数。函数签名如下:

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代码:

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() {@Overridepublic Integer call(String s) throws Exception {return s.length();}},true,1).foreach(s -> System.out.println(s ));
sc.stop();

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代码:

SparkConf conf = new SparkConf().setMaster("local").setAppName("SortByKeyTest");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaPairRDD rdd = sc.parallelizePairs(Arrays.asList(new Tuple2(10, "zhangsan"),new Tuple2(20, "lisi"),new Tuple2(30, "wangwu"),new Tuple2(40, "maliu")
));
//sortBy:按照字符串长度进行排序
//按照key进行排序,false降序排序
rdd.sortByKey(false).foreach(new VoidFunction>() {@Overridepublic void call(Tuple2 integerStringTuple2) throws Exception {System.out.println(integerStringTuple2);}
});
sc.stop();

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博客
  • 停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨
http://www.rkmt.cn/news/26628.html

相关文章:

  • 完整教程:web前端团队开发code review方案最佳实践
  • 最大值的不同统计方法
  • 加密货币如何改变金融诈骗的游戏规则
  • java的字符和字符串
  • python_日志记录-loguru
  • 2025年流量计厂家权威推荐榜单:电磁流量计、超声波流量计、涡街流量计、质量流量计专业制造商深度解析
  • day03-Coze记忆-对话体验
  • 2025年印染水洗机厂家权威推荐榜:高效水洗设备与环保节能技术深度解析,专业水洗机厂家精选
  • 2025年角接触轴承厂家推荐排行榜,高精度/高承载/高精密/机床主轴/汽车/定制/可替代进口/高转速/高刚性角接触球轴承公司推荐
  • datadome 二维数组
  • 2025年精密球轴承厂家权威推荐榜:半导体设备轴承,机床主轴轴承,真空泵轴承,国产高端精密球轴承,晶圆搬运机械手臂不锈钢轴承
  • 使用SpringBoot + Thymeleaf + MyBatisPlus实现一个简单的书籍管理系统-demo2
  • 2025年超声波清洗机厂家电话推荐:广东洁泰设备选型与联系指引
  • 2025年超声波清洗机厂家电话推荐:广东洁泰超声设备有限公司
  • AI转型困境:仅13%企业实现技术落地
  • 2025年激光切割机厂家电话推荐:济南邦德激光股份有限公司4009917771
  • 实用指南:Python全栈(基础篇)——Day05:后端内容(dict与set+while循环+for循环+实战演示+每日一题)
  • maven添加自己下载的jar到本地仓库
  • 2025年防静电/劳保/国网/餐厅/工厂/电工/防酸碱/电力/车间/航空/员工广告衫,文化衫/t恤/polo衫/冲锋衣厂家推荐排行榜
  • 2025年手持光谱仪厂家权威推荐榜:光谱分析仪/便携式光谱仪、矿石元素分析、合金金属不锈钢铝合金、贵金属三元催化检测设备精选
  • 2025年定型机厂家推荐排行榜,拉幅定型机/门富士,节能定型机/余热回收,废气回收/烟气回收,智能排风/双层定型机源头企业深度解析
  • 单提交智能评审上线!用云效精准定位复杂 MR 代码问题
  • ubuntu安装nvidia驱动 - Leonardo
  • 十五、深入理解 SELinux - 指南
  • 2025 年少儿英语品牌口碑排行榜最新发布:欧美外教 + 原版教材甄选,含最新推荐及靠谱选择指南
  • GitLab小坑:remote: GitLab: You are not allowed to create protected branches on this project.
  • 使用StockTV数据源对接美国股票数据
  • jdk8安装
  • Linux网络编程——UdpServer - 实践
  • 2025年最新游戏机和游艺机的屏幕驱动方案(含音乐播放和功放芯片)