Spark-RDD常用算子

算子的分类

spark的rdd的算子可以分为两大类:Transformation算子和 Action算子,其中Transformation算子是惰性的,只有rdd触发 Action算子时,才会执行Transformation算子;并且每个Transformation算子都会生成一个Task,每个Action算子都会生成一个job。

Transformation算子

parallelize:将Scala的数值和集合创建成RDD。

makeRDD:将Scala的数值和集合创建成RDD。

partitions.length:查看RDD的分区数量。
filter:过滤RDD中满足条件的数据。

map:对RDD数据进行某种逻辑操作。

sortBy:对RDD的数据进行排序,"true"为升序,"false"为降序。

union:对两个RDD数据求并集。

intersection:对两个RDD数据求交集。

diff:对两个RDD数据求差集。
注:对RDD进行,并、交和差集时,两个RDD的数据类型必须一致。

distinct:对RDD数据进行去重。

join:对两个RDD数据进行join(连接)操作。

leftOuterJoin:对两个RDD数据进行左连接。

rightOuterJoin:对两个RDD数据进行右连接。
注:左、右连接操作时,使用"None"带替"null"

cogroup:对两个RDD数据进行协分布操作。
注:协分布是将两个RDD集合中数据为"null"的数据使用"CompactBuffer()"代替。

mapValues:将RDD数据(以"key-value"的形式存储)中Value值进行某种操作。

groupByKey:将RDD数据(以"key-value"的形式存储)中key值相同的value分配到一组中。

reduceByKey:将RDD数据(以"key-value"的形式存储)中key值相同的value先局部聚合,在全局聚合。

cartesian:将两个RDD进行笛卡尔积。

mapPartitionsWithIndex:一次拿出一个分区的数据,并且可以将分区的编号取出来。

//逻辑操作:
val func = (index: Int, iter: Iterator[Int]) => {
  iter.map(x => "[partID:" +  index + ", val: " + x + "]")
}

mapPartition:一次拿出一个分区的数据。

//逻辑操作:
var  func = (iter: Iterator[Int])=>{
      iter.map(x => s"val:$x")
    }

aggregateByKey:先将相同key的数据进行分组,然后在局部操作,最后再全局操作,可以指定初始值,指定的初始值会在每个分区都使用一次,但是在最后的全局操作时,初始值不进行操作。

aggregate:先局部操作,再全局操作,可以指定初始值,指定的初始值会在每个分区都使用一次,并且也会在最后的全局操作时,在使用一次。

filterByRange:过滤某个范围的数据,前后都是闭区间。

flatMapValues:对RDD中的value值进行flatMap操作。

foldByKey:同aggregateByKey。

combineByKey:该算子是一个底层的算子,他会向将key进行分组,他需要传递三个函数,第一个函数是将分好的key的第一个value取出来进行某种操作;第二个函数是在每个分区中,将value中的其他元素进行某种操作。第三个函数是将每个分区中的数据汇总后,相同的key进行某种操作。并且可以给他传递一个HashPartition来修改他的分区数量。

mapPartitions:对一个分区进行map操作,参数是一个迭代器,返回值也是一个迭代器。
partitionBy:将数据按照指定的分区器进行分区,参数是一个分区器。

cache:将RDD中的数据存储放到spark的内存中,他与其他的Transformation算子不同,他不会生成新的RDD,而是将调用他的RDD标记,当第一次触发Action算子时,会将该RDD放入到spark的内存中,之后再使用该RDD中的数据时,就直接在内存中读取,速度非常快;当要缓存到内存的数据太大时,调用该方法并且触发Action算子后,会将一部分数据存储到内存中(存储到Executor端)。一旦将数据存储在内存中后,必须使用方法来讲内存中的数据释放掉,或者将该RDD的应用终止。

unpersist(Boolean):将内存中的数据释放掉,"true"表示同步释放,"false"表示异步释放。

checkpint:将spark的中间数据存储到指定的目录中,用于切断RDD的血缘关系,确保RDD数据能够快速恢复。

setCheckpointDir:指定RDD中间数据存储的目录。

Action算子

collect:将RDD的结果以数组的形式返回。

reduce:返回RDD数据进行某种逻辑操作("+"、"-"等)后的结果。

top(n):返回RDD中最大的前n个数据(此算子会先将RDD进行降序排列)。

take(n):返回RDD中前n个数据。

first:返回RDD中第一个数据。

takeOrdered(n):返回RDD中最小的前n个数据(此算子会先将RDD进行升序排列)。

count:返回RDD中数据的个数。

collectAsMap:将RDD的结果以map的形式返还。

saveAsTextFile:将RDD的结果以Text格式存储到HDFS系统中。

countByKey:统计RDD中同一key出现的次数,与key的value值无关。

countByValue:统计RDD中相同数据出现的次数,即key值与value值都相同。

foreach:将RDD的数据一条一条输出到spark的worker节点管理的Executor中。

foreachPartition:将RDD的数据一个分区的数据输出到spark的worker节点管理的Executor中。

rdd.foreachPartition(x => x.foreach(y=>println(y*100)))

注:只要是算子中带有"By"的,他操作的RDD的数据类型都是以"key-value"的形式,并且他是分区器默认是"Hash-Partition"。

变分模态分解(Variational Mode Decomposition, VMD)是一种强大的非线性、无参数信号处理技术,专门用于复杂非平稳信号的分析与分解。它由Eckart Dietz和Herbert Krim于2011年提出,主要针对传统傅立叶变换在处理非平稳信号时的不足。VMD的核心思想是将复杂信号分解为一系列模态函数(即固有模态函数,IMFs),每个IMF具有独特的频率成分和局部特性。这一过程与小波分析或经验模态分解(EMD)类似,但VMD通过变分优化框架显著提升了分解的稳定性和准确性。 在MATLAB环境中实现VMD,可以帮助我们更好地理解和应用这一技术。其核心算法主要包括以下步骤:首先进行初始化,设定模态数并为每个模态分配初始频率估计;接着采用交替最小二乘法,通过交替最小化残差平方和以及模态频率的离散时间傅立叶变换(DTFT)约束,更新每个模态函数和中心频率;最后通过迭代优化,在每次迭代中优化所有IMF的幅度和相位,直至满足停止条件(如达到预设迭代次数或残差平方和小于阈值)。 MATLAB中的VMD实现通常包括以下部分:数据预处理,如对原始信号进行归一化或去除直流偏置,以简化后续处理;定义VMD结构,设置模态数、迭代次数和约束参数等;VMD算法主体,包含初始化、交替最小二乘法和迭代优化过程;以及后处理,对分解结果进行评估和可视化,例如计算每个模态的频谱特性,绘制IMF的时频分布图。如果提供了一个包含VMD算法的压缩包文件,其中的“VMD”可能是MATLAB代码文件或完整的项目文件夹,可能包含主程序、函数库、示例数据和结果可视化脚本。通过运行这些代码,可以直观地看到VMD如何将复杂信号分解为独立模态,并理解每个模态的物理意义。 VMD在多个领域具有广泛的应用,包括信号处理(如声学、振动、生物医学信号分析)、图像处理(如图像去噪、特征提取)、金融时间序列分析(识
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值