Spark源码阅读(一)RDD

本文详细解析了Spark中的persist()与cache()的区别与联系,countByKey()与countByValue()的内部实现方式,以及isEmpty()方法的具体实现逻辑。对于persist()与cache()而言,两者主要区别在于存储级别,默认为MEMORY_ONLY。countByKey()通过reduceByKey实现键值计数,适用于键数量适中场景,避免内存溢出。countByValue()则依赖于countByKey()完成值的计数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. persist() & cache()

  def persist(): this.type = persist(StorageLevel.MEMORY_ONLY)

  def cache(): this.type = persist()

可以看出persist的存储级别是MEMORY_NOLY
cache 与 persist 完全一样

2. countByKey & countByValue

  def countByKey(): Map[K, Long] = self.withScope {
    self.mapValues(_ => 1L).reduceByKey(_ + _).collect().toMap
  }

countByKey调用了reduceByKey,并且collect后转换成了map。所以如果Key的量比较大,谨慎调用该函数,否则会OOM,可以直接使用reduceByKey实现而不collect。

  def countByValue()(implicit ord: Ordering[T] = null): Map[T, Long] = withScope {
    map(value => (value, null)).countByKey()
  }

countByValue直接调用了countByKey

3. isEmpty()

  def isEmpty(): Boolean = withScope {
    partitions.length == 0 || take(1).length == 0
  }

isEmpty 操作是先调用partitions的长度,如果为0直接判断为true,如果不为0;再去一个元素看是否为空。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值