Spark中的cache()会改变RDD的状态还是创建一个新的RDD?

2024-03-31

这个问题是我之前问题的后续问题如果我在 Spark 中缓存同一个 RDD 两次会发生什么 https://stackoverflow.com/questions/36195105/what-happens-if-i-cache-the-same-rdd-twice-in-spark.

打电话时cache()在 RDD 上,RDD 的状态是否发生变化(返回的 RDD 只是this为了便于使用)或者创建一个新的 RDD 来包装现有的 RDD?

下面的代码会发生什么:

// Init
JavaRDD<String> a = ... // some initialise and calculation functions.
JavaRDD<String> b = a.cache();
JavaRDD<String> c = b.cache();

// Case 1, will 'a' be calculated twice in this case 
// because it's before the cache layer:
a.saveAsTextFile(somePath);
a.saveAsTextFile(somePath);

// Case 2, will the data of the calculation of 'a' 
// be cached in the memory twice in this case
// (once as 'b' and once as 'c'):
c.saveAsTextFile(somePath);

当在 RDD 上调用 cache() 时,RDD 的状态是否改变(以及 返回的 RDD 只是为了方便使用)或者创建一个新的 RDD 包裹现有的

相同RDD被返回 https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/rdd/RDD.scala#L165:

/**
 * Mark this RDD for persisting using the specified level.
 *
 * @param newLevel the target storage level
 * @param allowOverride whether to override any existing level with the new one
 */
  private def persist(newLevel: StorageLevel, allowOverride: Boolean): this.type = {
  // TODO: Handle changes of StorageLevel
  if (storageLevel != StorageLevel.NONE && newLevel != storageLevel && !allowOverride) {
    throw new UnsupportedOperationException(
      "Cannot change storage level of an RDD after it was already assigned a level")
}
  // If this is the first time this RDD is marked for persisting, register it
  // with the SparkContext for cleanups and accounting. Do this only once.
  if (storageLevel == StorageLevel.NONE) {
    sc.cleaner.foreach(_.registerRDDForCleanup(this))
    sc.persistRDD(this)
  }
  storageLevel = newLevel
  this
}

缓存不会对上述 RDD 造成任何副作用。如果它已经被标记为持久化,则什么也不会发生。如果不是,唯一的副作用是将其注册到SparkContext,其中副作用不在RDD本身,而是上下文。

Edit:

看着JavaRDD.cache https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/api/java/JavaRDD.scala#L38,看来底层调用会导致另一个的分配JavaRDD:

/** Persist this RDD with the default storage level (`MEMORY_ONLY`). */
def cache(): JavaRDD[T] = wrapRDD(rdd.cache())

Where wrapRDD calls JavaRDD.fromRDD:

object JavaRDD {

  implicit def fromRDD[T: ClassTag](rdd: RDD[T]): JavaRDD[T] = new JavaRDD[T](rdd)
  implicit def toRDD[T](rdd: JavaRDD[T]): RDD[T] = rdd.rdd
}

这将导致分配一个新的JavaRDD。也就是说,内部实例RDD[T]将保持不变。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark中的cache()会改变RDD的状态还是创建一个新的RDD? 的相关文章

  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • 从 PySpark RDD 中的每个组中取出前 N 个元素(不使用 groupByKey)

    我有一个如下所示的 RDD dataSource sc parallelize user1 3 blue user1 4 black user2 5 white user2 3 black user2 6 red user1 1 red 我
  • GWT - 如何组织项目以拥有多个网页以及它们之间的导航

    我是 GET 的新手 顺便说一句 它给我留下了深刻的印象 并且发现它对于像我这样熟悉 C NET 桌面技术并愿意编写 Web 应用程序的人来说非常有吸引力 我根据 GWT Eclipse 向导生成的示例启动了自己的项目 该项目生成带有面板的
  • Spring RestTemplate 使用 cookie 遵循重定向

    最近我遇到了一个问题 我需要做一个GET请求远程服务 我假设使用一个简单的 servlet 并且 RestTemplate 返回Too many redirects 经过一番调查 似乎对指定远程服务发出的第一个请求实际上只是一个 302 重
  • Integer.parseInt("0x1F60A") 以 NumberformatException 结束

    我尝试从数据库中获取长字符串内的表情符号代码 格式如下 0x1F60A 所以我可以访问代码 但它将是String 起初 我尝试通过执行以下操作来转换变量tv setText beforeEmo getEmijoByUnicode int e
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • Jackson XML ArrayList 输出具有两个包装器元素

    我在 Jackson 生成的 XML 输出中得到了两个包装器元素 我只想拥有一个 我有一个 Java bean Entity Table name CITIES JacksonXmlRootElement localName City pu
  • Java:如何为山区时间创建 TimeZone 对象?

    必须不禁用夏令时 嗯 在这个清单 http en wikipedia org wiki List of tz database time zones在 zoneinfo 时区名称中 有很多声称是 山地时间 找到最适合您想要的那个 然后使用它
  • Java实现累加器类,提供Collector

    A Collector具有三种通用类型 public interface Collector
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • QuerySyntaxException:无法找到类

    我正在使用 hql 生成 JunctionManagementListDto 类的实际 Java 对象 但我最终在控制台上出现以下异常 org hibernate hql internal ast QuerySyntaxException
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • Hamcrest Matchers - 断言列表类型

    问题 我目前正在尝试使用 Hamcrest Matchers 来断言返回的列表类型是特定类型 例如 假设我的服务调用返回以下列表 List
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 在spark-kafka中使用schema将ConsumerRecord值转换为Dataframe

    我正在使用 Spark 2 0 2 和 Kafka 0 11 0 并且 我正在尝试在火花流中使用来自卡夫卡的消息 以下是代码 val topics notes val kafkaParams Map String Object bootst
  • 如何使用play框架上传多个文件?

    我在用play framework 2 1 2 使用java我正在创建视图来上传多个文件 我的代码在这里 form action routes upload up enctype gt multipart form data
  • org.apache.commons.net.io.CopyStreamException:复制时捕获 IOException

    我正在尝试使用以下方法中的代码将在我的服务器中创建的一些文件复制到 FTP 但奇怪的是我随机地低于错误 我无法弄清楚发生了什么 Exception org apache commons net io CopyStreamException
  • 泛型、数组和 ClassCastException

    我想这里一定发生了一些我不知道的微妙事情 考虑以下 public class Foo
  • 在java中使用多个bufferedImage

    我正在 java 小程序中制作游戏 并且正在尝试优化我的代码以减少闪烁 我已经实现了双缓冲 因此我尝试使用另一个 BufferedImage 来存储不改变的游戏背景元素的图片 这是我的代码的相关部分 public class QuizApp

随机推荐

  • 致命异常主要 Android 应用程序

    我目前正在开发 Android 应用程序 当我单击菜单时 菜单会显示 但如果您选择 首选项 它就会崩溃 如果您单击 新建 则效果很好 我不知道发生了什么事 我是 Android 应用程序开发和 eclipse IDE 的新手 所以任何东西都
  • 如何编写 Linux .dts 设备树文件?

    我要在我的开发板上启动Linux 我需要一个dts文件 设备树文件 来描述整个硬件 但我对这个文件的语法知之甚少 不足以在板上正确运行Linux 我现在所知道的只是如何描述一个单元的中断号 频率 地址 父单元及其兼容的驱动程序类型 如下所述
  • 如何在rails 2.3.3中有条件地分配ActionController::Base.session

    我有一个 Rails 应用程序 在 config initializers session store rb 文件中包含以下内容 ActionController Base session key gt app session secret
  • WPF:将标签绑定到类属性

    我试图将标签的内容绑定到类实例的字符串属性 但没有取得太大成功 XAML
  • AVFrame 到 QImage 的高效转换

    我需要在基于 Qt 的应用程序中从视频中提取帧 使用 ffmpeg 库 我可以将帧作为 AVFrame 获取 我需要将其转换为 QImage 以在应用程序的其他部分中使用 这种转换必须是高效的 到目前为止看来sws scale 是正确使用的
  • 如何通过HTTPPost发送图片?

    我正在创建一个活动 需要使用他们的 API 将图像上传到网络服务 我发现如果我使用 UrlEncodedFormEntity 并通过它发送图像数据 网络服务没有收到该信息 至少它无法读取该内容 事实上 如果我添加一些变量与图像数据一起发送
  • 无法使用重复的“graphql”模块

    我发现graphql js https github com graphql graphql js库不允许依赖项也使用 graphql 你会得到以下错误 Duplicate graphql modules cannot be used at
  • 多行点线或虚线文本下划线

    因为 CSS 文本下划线只允许使用实线 并且它的位置位于字符串的底部 所以我使用 border bottom 加上一点填充来实现点或虚线文本下划线 h2 border bottom 1px dotted 999 padding bottom
  • 在 Ada 中立即开始循环的下一次迭代

    我想要一个无限循环 其中循环几乎贯穿整个程序 并且在任何时候 基于条件语句 我希望它退出循环的特定迭代并返回到顶部并执行 有办法做到这一点吗 它不必是无限循环 它可以是一个for循环 我只想让它进入该循环的下一次迭代 您可以使用 goto
  • 如何简单地验证 Rails 中的复选框

    如何简单地验证 Rails 中的复选框是否已选中 该复选框用于最终用户协议 它位于模式窗口中 可以说我有复选框 我应该在哪里以及如何验证这一点 我在这里看到了大多数关于 Rails 中复选框验证的帖子 但没有一个适合我的需要 Adding
  • 使用 ADO.Net 将 utf-8 写入 SQL Server 文本字段并维护 UTF-8 字节

    我有一些编码为 UTF 8 的 xml 我想将其写入 SQL Server 中的文本字段 UTF 8 与 Text 字节兼容 因此它应该能够执行此操作 然后读出仍编码为 utf 8 的 xml 然而 UTF 8 中的多字节特殊字符 例如 会
  • 如何从 AS3 代码调用 Tamarin ESC 编译器?

    我正在尝试从 AS3 代码调用 Tamarin 的 ESC 编译器 我已经在 Flash Player 中加载了 ESC 编译器字节代码 但是当我调用它时 ESC 编译器总是返回相同的不执行任何操作的字节代码 无论我提供什么源代码 人类可读
  • TclError: # 参数错误错误

    我不知道出了什么问题 但我一直收到这个信息 Tkinter 回调中出现异常 回溯 最近一次调用最后一次 文件 Library Frameworks Python framework Versions 7 3 lib python2 7 li
  • Jersey 1.6 和 Spring 3.0.5 使用 Maven

    我很难让 Jersey 与 Spring 3 0 5 一起工作 我发现很多人说他们能够让它发挥作用 但我运气不好 我总是得到 java lang NoSuchMethodError org springframework web conte
  • 如何使用CloudKit的CKShare创建共享?

    我正在研究新的CKShare苹果今年发布的 我对此有一些疑问 我试图关注 WWDC 的 CloudKit 中的新增功能 视频 但部分代码在 Xcode 中不再工作 我想做的是 用户输入他的姓名和电话 然后单击UIButton 将与特定的人分
  • 与Linux中的内存映射设备通信

    我有一个内存映射设备 我需要与它通信 我的老板告诉我可以通过 dev mem 我在网上查了一下 没有找到任何相关的内容 是否可以做到 或者我的老板错了 假设您拥有超级用户权限 任何帮助表示赞赏 你在地址处有一个内存映射设备MMIO ADDR
  • 如何检查文本视图中输入的拼写?

    我有一个 UITextview 用户在其中输入文本 之后 我将该文本作为字符串并将其显示在另一个文本视图中 并想要语法不正确的单词 怎么做 使用自 ios 3 2 起可用的 UITextChecker 类 苹果文档 http develop
  • 如何放大特定点(没有画布)?

    目标很简单 使用鼠标滚轮放大特定点 鼠标所在的位置 这意味着缩放后 鼠标将位于图片的大致相同位置 Purely illustrative I don t care if you use dolphins ducks or madonna f
  • 使用 $not 进行 MongoDB 地理空间查询

    我有一个在 MongoDB 中运行良好的基本地理空间查询 似乎应用 not 来获得补集应该很容易 但它对我不起作用 这是简单的用户错误吗 或者 MongoDB 在概念上不能处理这个查询吗 我在中找不到任何此类限制文档 http www mo
  • Spark中的cache()会改变RDD的状态还是创建一个新的RDD?

    这个问题是我之前问题的后续问题如果我在 Spark 中缓存同一个 RDD 两次会发生什么 https stackoverflow com questions 36195105 what happens if i cache the same