Spark RDD


def compute(split: Partition, context: TaskContext): Iterator[T]


protected def getPartitions: Array[Partition]


protected def getDependencies: Seq[Dependency[_]] = deps


protected def getPreferredLocations(split: Partition): Seq[String] = Nil

@transient val partitioner: Option[Partitioner] = None

only for key-value  


narrow-dependency:
分区: 与父RDD一致
依赖: 与父RDD一对一
函数: transformation 映射 
最佳位置: no
分区策略: no


joined-RDD:
分区: 每个reduce一个分区
依赖: 宽依赖,多个或所有父RDD
函数:  shuffle后的数据
最佳位置: no
分区策略: HashPartitioner(partitions: Int)

宽依赖 窄依赖
宽依赖    子RDD的partition 依赖于所有父RDD partitions 
         影响:如果父节点挂掉,将需要恢复所有父节点后才能计算子节点; 不能并行计算
窄依赖    子RDD的partition  只依赖于最多一个RDD partition
         影响:如果父节点挂掉,只需恢复最多一个父节点; 可以完全并行计算

-> 关键点是 在stage分界点位置(shuffle处需要宽依赖的父节点要落地persist)


transformation


--map:

*自定义函数处理方式
JavaRDD<Integer> lineLengths = lines.map(newFunction<String, Integer>() {
  publicInteger call(String s) {returns.length(); }
});
--mapPartitions:
//iter 表示 每个分区的迭代器,不是每个元素
val a = sc.parallelize(1 to 9, 3)
def myfunc[T](iter: Iterator[T]) : Iterator[(T, T)] = {
    var res = List[(T, T)]() 
    var pre = iter.next while (iter.hasNext) {
        val cur = iter.next; 
        res .::= (pre, cur) pre = cur;
    } 
    res.iterator
}
a.mapPartitions(myfunc).collect
 Array((2,3), (1,2), (5,6), (4,5), (8,9), (7,8))

--mapPartitionsWithIndex
var rdd1 = sc.makeRDD(1 to 9,3)
//rdd1有两个分区
var rdd2 = rdd1.mapPartitionsWithIndex{
        (x,iter) => {
          var result = List[String]()
            var i = 0
            while(iter.hasNext){
              i += iter.next()
            }
            result.::(x + "|" + i).iterator
           
        }
      }
//rdd2将rdd1中每个分区的数字累加,并在每个分区的累加结果前面加了分区索引
scala> rdd2.collect
res13: Array[String] = Array(0|6, 1|15, 2|24)
--mapValues
val a = sc.parallelize(List("dog", "tiger", "lion", "cat", "panther", " eagle"), 2)
val b = a.map(x => (x.length, x))
b.mapValues("x" + _ + "x").collect
b.mapValues("x" + _ + "x").reduceByKey(_+_).collect  //这里的mapValues只是map value,reduceByKey里的key仍然是元祖的key,即tuple.1

--mapWith
val x = sc.parallelize(List(1,2,3,4,5,6,7,8,9,10), 3) 
x.mapWith(a => a * 10)((a, b) => (b + 2)).collect 
=> partition index  乘以10  -> (0,1,2)
def mapWith[A: ClassTag, U: ](constructA: Int => A, preservesPartitioning: Boolean = false)(f: (T, A) => U): RDD[U]
第一个函数constructA是把RDD的partition index(index从0开始)作为输入,输出为新类型A;
第二个函数f是把二元组(T, A)作为输入(其中T为原RDD中的元素,A为第一个函数的输出),输出类型为U。
注意使用 sc.parallelize(***,N) 表示把数据集分成N块,每块执行相应function

引用: http://blog.youkuaiyun.com/lfz_carlos/article/details/50753695


       http://lxw1234.com/archives/2015/07/348.htm

Action







基于实时迭代的数值鲁棒NMPC双模稳定预测模型(Matlab代码实现)内容概要:本文介绍了基于实时迭代的数值鲁棒非线性模型预测控制(NMPC)双模稳定预测模型的研究与Matlab代码实现,重点在于提升系统在存在不确定性与扰动情况下的控制性能与稳定性。该模型结合实时迭代优化机制,增强了传统NMPC的数值鲁棒性,并通过双模控制策略兼顾动态响应与稳态精度,适用于复杂非线性系统的预测控制问题。文中还列举了多个相关技术方向的应用案例,涵盖电力系统、路径规划、信号处理、机器学习等多个领域,展示了该方法的广泛适用性与工程价值。; 适合人群:具备一定控制理论基础和Matlab编程能力,从事自动化、电气工程、智能制造、机器人控制等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于非线性系统的高性能预测控制设计,如电力系统调度、无人机控制、机器人轨迹跟踪等;②解决存在模型不确定性、外部扰动下的系统稳定控制问题;③通过Matlab仿真验证控制算法的有效性与鲁棒性,支撑科研论文复现与工程原型开发。; 阅读建议:建议读者结合提供的Matlab代码进行实践,重点关注NMPC的实时迭代机制与双模切换逻辑的设计细节,同时参考文中列举的相关研究方向拓展应用场景,强化对数值鲁棒性与系统稳定性之间平衡的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值