spark core

Spark Core一、Spark-Core编程(二)1、RDD转换算子RDD 根据数据处理方式的不同将算子整体上分为 Value 类型、双 Value 类型和 Key-Value 类型。2、Value类型:1) map① 函数签名def map[U: ClassTag](f: T => U): RDD[U]② 函数说明将处理的数据逐条进行映射转换,这里的转换可以是类型的转换,也可以是值的转换。val sparkConf = new SparkConf().setMaster("local[*]").setAppName("RDD_function")val sparkContext = new SparkContext(sparkConf) val dataRDD: RDD[Int] = sparkContext.makeRDD(List(1, 2, 3, 4))val dataRDD1: RDD[Int] = dataRDD.map( num => { num * 2 })val dataRDD2: RDD[String] = dataRDD1.map( num => { "" + num })sparkContext.stop() 2)mapPartitions① 函数签名def mapPartitions[U: ClassTag](f: Iterator[T] => Iterator[U],preservesPartitioning: Boolean = false): RDD[U]② 函数说明将待处理的数据以分区为单位发送到计算节点进行处理,这里的处理是指可以进行任意的处理,哪怕是过滤数据。val dataRDD1: RDD[Int] = dataRDD.mapPartitions( datas => { datas.filter(==2) }) map 和 mapPartitions 的区别:① 数据处理角度Map 算子是分区内一个数据一个数据的执行,类似于串行操作。而 mapPartitions 算子是以分区为单位进行批处理操作。② 功能的角度Map 算子主要目的将数据源中的数据进行转换和改变。但是不会减少或增多数据。MapPartitions 算子需要传递一个迭代器,返回一个迭代器,没有要求的元素的个数保持不变,所以可以增加或减少数据③ 性能的角度Map 算子因为类似于串行操作,所以性能比较低,而是 mapPartitions 算子类似于批处理,所以性能较高。但是 mapPartitions 算子会长时间占用内存,那么这样会导致内存可能不够用,出现内存溢出的错误。所以在内存有限的情况下,不推荐使用。使用 map 操作。 3)mapPartitionsWithIndex① 函数签名def mapPartitionsWithIndex[U: ClassTag](f: (Int, Iterator[T]) => Iterator[U],preservesPartitioning: Boolean = false): RDD[U]② 函数说明将待处理的数据以分区为单位发送到计算节点进行处理,这里的处理是指可以进行任意的处理,哪怕是过滤数据,在处理时同时可以获取当前分区索引。 4)flatMap① 函数签名def flatMap[U: ClassTag](f: T => TraversableOnce[U]): RDD[U]② 函数说明将处理的数据进行扁平化后再进行映射处理,所以算子也称之为扁平映射。val dataRDD = sparkContext.makeRDD(List( List(1,2),List(3,4)),1)val dataRDD1 = dataRDD.flatMap( list => list) map和flatMap的区别:map会将每一条输入数据映射为一个新对象。flatMap包含两个操作:会将每一个输入对象输入映射为一个新集合,然后把这些新集合连成一个大集合。 5)glom① 函数签名def glom(): RDD[Array[T]]② 函数说明将同一个分区的数据直接转换为相同类型的内存数组进行处理,分区不变val dataRDD = sparkContext.makeRDD(List( 1,2,3,4),1)val dataRDD1:RDD[Array[Int]] = dataRDD.glom() 6)groupBy① 函数签名def groupBy[K](f: T => K)(implicit kt: ClassTag[K]): RDD[(K, Iterable[T])]② 函数说明将数据根据指定的规则进行分组, 分区默认不变,但是数据会被打乱重新组合,我们将这样的操作称之为 shuffle。极限情况下,数据可能被分在同一个分区中。一个组的数据在一个分区中,但是并不是说一个分区中只有一个组val dataRDD = sparkContext.makeRDD(List(1,2,3,4),1)val dataRDD1 = dataRDD.groupBy( %2) 7)filter① 函数签名def filter(f: T => Boolean): RDD[T]② 函数说明将数据根据指定的规则进行筛选过滤,符合规则的数据保留,不符合规则的数据丢弃。当数据进行筛选过滤后,分区不变,但是分区内的数据可能不均衡,生产环境下,可能会出现数据倾斜。val dataRDD = sparkContext.makeRDD(List( 1,2,3,4),1)val dataRDD1 = dataRDD.filter(%2 == 0)val dataRDD2 = dataRDD.filter(%2 == 1) 8)sample① 函数签名def sample( withReplacement: Boolean, fraction: Double, seed: Long = Utils.random.nextLong): RDD[T]② 函数说明根据指定的规则从数据集中抽取数据val dataRDD = sparkContext.makeRDD(List( 1,2,3,4),1)// 抽取数据不放回(伯努利算法)// 伯努利算法:又叫 0、1 分布。例如扔硬币,要么正面,要么反面。// 具体实现:根据种子和随机算法算出一个数和第二个参数设置几率比较,小于第二个参数要,大于不要// 第一个参数:抽取的数据是否放回,false:不放回// 第二个参数:抽取的几率,范围在[0,1]之间,0:全不取;1:全取;// 第三个参数:随机数种子 val dataRDD1 = dataRDD.sample(false, 0.5) // 抽取数据放回(泊松算法)// 第一个参数:抽取的数据是否放回,true:放回;false:不放回// 第二个参数:重复数据的几率,范围大于等于 0.表示每一个元素被期望抽取到的次数// 第三个参数:随机数种子 val dataRDD2 = dataRDD.sample(true, 2) 9) distinct① 函数签名def distinct()(implicit ord: Ordering[T] = null): RDD[T]def distinct(numPartitions: Int)(implicit ord: Ordering[T] = null): RDD[T]② 函数说明将数据集中重复的数据去重 val dataRDD = sparkContext.makeRDD(List( 1,2,3,4,1,2))val dataRDD1 = dataRDD.distinct()val dataRDD2 = dataRDD.distinct(2)

相关推荐
岩苍美津未13 小时前
H5项目在微信公众号中如何本地调试微信sdk
微信·微信小程序
龚子亦13 小时前
【数字人开发】Unity+百度智能云平台实现短语音文本识别功能
百度·unity·游戏引擎
云起SAAS17 小时前
猜数字小游戏微信流量主小程序开源
微信·小程序·猜数字小游戏微信流量主小
云起SAAS17 小时前
经典俄罗斯方块微信小游戏流量主小程序开源
微信·小程序·经典俄罗斯方块微信小游戏流
云起SAAS19 小时前
数字华容道智力小游戏微信流量主小程序开源
微信·小程序·数字华容道智力小游戏微信流
跨境知识搬运工1 天前
2025年TikTok注册账号常见问题解答
facebook
iPad协议个微协议1 天前
微信二次开发,对接智能客服逻辑
微信
是罐装可乐1 天前
微信中 qrcode 生成二维码长按无效果的解决方案
前端·javascript·微信
從南走到北2 天前
物业收费管理小程序ThinkPHP+UniApp
微信小程序·小程序·uni-app·微信公众平台
小倪有点菜2 天前
微信原生小程序转uniapp过程及错误总结
微信·小程序·uni-app