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







根据原作 https://pan.quark.cn/s/0ed355622f0f 的源码改编 野火IM解决方案 野火IM是专业级即时通讯和实时音视频整体解决方案,由北京野火无限网络科技有限公司维护和支持。 主要特性有:私有部署安全可靠,性能强大,功能齐全,全平台支持,开源率高,部署运维简单,二次开发友好,方便与第三方系统对接或者嵌入现有系统中。 详细情况请参考在线文档。 主要包括一下项目: 野火IM Vue Electron Demo,演示如何将野火IM的能力集成到Vue Electron项目。 前置说明 本项目所使用的是需要付费的,价格请参考费用详情 支持试用,具体请看试用说明 本项目默认只能连接到官方服务,购买或申请试用之后,替换,即可连到自行部署的服务 分支说明 :基于开发,是未来的开发重心 :基于开发,进入维护模式,不再开发新功能,鉴于已经终止支持且不再维护,建议客户升级到版本 环境依赖 mac系统 最新版本的Xcode nodejs v18.19.0 npm v10.2.3 python 2.7.x git npm install -g node-gyp@8.3.0 windows系统 nodejs v18.19.0 python 2.7.x git npm 6.14.15 npm install --global --vs2019 --production windows-build-tools 本步安装windows开发环境的安装内容较多,如果网络情况不好可能需要等较长时间,选择早上网络较好时安装是个好的选择 或参考手动安装 windows-build-tools进行安装 npm install -g node-gyp@8.3.0 linux系统 nodej...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值