Spark:测试 RDD 是否为空的有效方法

2023-12-27

没有一个isEmptyRDD 上的方法,那么测试 RDD 是否为空的最有效方法是什么?


RDD.isEmpty() https://issues.apache.org/jira/browse/SPARK-5270将成为 Spark 1.3.0 的一部分。

根据中的建议这个 apache 邮件线程 http://mail-archives.apache.org/mod_mbox/spark-user/201402.mbox/%3CCAKDwOakbF9pop+pN8XzF6iT1OPc383+aWcTf2a6t=rH8srxRLg@mail.gmail.com%3E以及后来对这个答案的一些评论,我做了一些小的本地实验。最好的方法是使用take(1).length==0.

def isEmpty[T](rdd : RDD[T]) = {
  rdd.take(1).length == 0 
}

它应该运行在O(1)除非 RDD 为空,在这种情况下,它的分区数量是线性的。

感谢乔什·罗森和尼克·查马斯向我指出了这一点。

注意:如果 RDD 类型为RDD[Nothing] e.g. isEmpty(sc.parallelize(Seq())),但这在现实生活中可能不是问题。isEmpty(sc.parallelize(Seq[Any]()))工作正常。


Edits:

  • Edit 1: Added take(1)==0方法,感谢评论。

我原来的建议: Use mapPartitions.

def isEmpty[T](rdd : RDD[T]) = {
  rdd.mapPartitions(it => Iterator(!it.hasNext)).reduce(_&&_) 
}

它应该扩大分区的数量,并且不像take(1)。然而,它对于 RDD 类型来说是鲁棒的RDD[Nothing].


实验:

我用这个代码来计时。

def time(n : Long, f : (RDD[Long]) => Boolean): Unit = {
  val start = System.currentTimeMillis()
  val rdd = sc.parallelize(1L to n, numSlices = 100)
  val result = f(rdd)
  printf("Time: " + (System.currentTimeMillis() - start) + "   Result: " + result)
}

time(1000000000L, rdd => rdd.take(1).length == 0L)
time(1000000000L, rdd => rdd.mapPartitions(it => Iterator(!it.hasNext)).reduce(_&&_))
time(1000000000L, rdd => rdd.count() == 0L)
time(1000000000L, rdd => rdd.takeSample(true, 1).isEmpty)
time(1000000000L, rdd => rdd.fold(0)(_ + _) == 0L)

time(1L, rdd => rdd.take(1).length == 0L)
time(1L, rdd => rdd.mapPartitions(it => Iterator(!it.hasNext)).reduce(_&&_))
time(1L, rdd => rdd.count() == 0L)
time(1L, rdd => rdd.takeSample(true, 1).isEmpty)
time(1L, rdd => rdd.fold(0)(_ + _) == 0L)

time(0L, rdd => rdd.take(1).length == 0L)
time(0L, rdd => rdd.mapPartitions(it => Iterator(!it.hasNext)).reduce(_&&_))
time(0L, rdd => rdd.count() == 0L)
time(0L, rdd => rdd.takeSample(true, 1).isEmpty)
time(0L, rdd => rdd.fold(0)(_ + _) == 0L)

在我的具有 3 个工作核心的本地计算机上,我得到了这些结果

Time:    21   Result: false
Time:    75   Result: false
Time:  8664   Result: false
Time: 18266   Result: false
Time: 23836   Result: false

Time:   113   Result: false
Time:   101   Result: false
Time:    68   Result: false
Time:   221   Result: false
Time:    46   Result: false

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

Spark:测试 RDD 是否为空的有效方法 的相关文章

随机推荐

  • 如何为列表框中的每个项目设置不同的工具提示文本?

    我有一个与对象集合进行数据绑定的列表框 列表框被配置为显示每个对象的标识符属性 我想显示一个工具提示 其中包含悬停在 列表框中的项目的特定信息 而不是整个列表框的一个工具提示 我正在 WinForms 中工作 感谢一些有用的博客文章 整理了
  • 无法在跨客户端google oauth2.0中交换访问令牌和刷新令牌的授权代码

    我在 Android 应用程序上实现 Google Play 服务登录并将授权代码传递到后端服务器时遇到问题 因此服务器将交换访问令牌和刷新令牌的代码 首先让我写几行已经尝试过 读过的内容 在 code google com apis co
  • Zookeeper 的临时 znode 的用例是什么?

    Zookeeper 文档内容如下 ZooKeeper 也有临时节点的概念 只要创建 znode 的会话处于活动状态 这些 znode 就会存在 当会话结束时 znode 将被删除 当您想要实现 待定 时 临时节点非常有用 我了解其功能 但是
  • PHP - 下载次数

    如何显示一个计数器来计算文件的下载次数 我以前见过 下载了 450 次 谢谢 不要让用户直接下载文件 而是通过如下脚本 file REQUEST file dldir downloads if file exists dldir file
  • 计时器、单击、mousedown、mouseup 事件不能一起工作

    正在寻找有关我遇到的问题的帮助 抱歉 如果这个问题已经被问过 我找不到类似的东西 这个想法是当点击图片框时将图像更改为ON 如果按住图片框超过 2 秒以打开新表单并将图片框保留为 关闭 但是 如果图片框被单击 打开 然后按住 2 秒然后返回
  • 在 xcode 中使用调试器 Commend 跳转断点

    我在 Xcode 中使用跳转命令设置了一个断点来强制传递某些条件 但是当它执行到第 168 行时 它崩溃并显示消息 Thread 1 EXC BAD ACCESS code 1 address 0x1 为什么会发生这种事 控制台记录 警告
  • 如何在core-plot中绘制Y轴网格?

    如何绘制X轴网格 即针对y 轴值绘制水平线 请帮我一下 sri 您需要设置majorGridLineStyle and or minorGridLineStyle轴上的属性 请参阅示例文件夹中的 CPTestApp 以获取一些示例代码
  • MIPS 32位架构:如何在同一时钟周期内读取和写入寄存器文件中的寄存器?

    我的计算机体系结构书籍解释了这一点 由于对寄存器文件的写入是边沿触发的 因此我们的设计可以 在一个时钟周期内合法地读写同一个寄存器 read 将得到在较早的时钟周期写入的值 而 写入的值将可在后续时钟周期中读取 这是有道理的 我有点明白寄存
  • R 帮助页面中的“未运行”是什么意思?

    有时 在 R 帮助页面上 注释中会出现短语 未运行 从 with 的帮助页面查看这一点 Examples require stats require graphics examples from glm Not run library MA
  • 如何在Matlab绘图中插入两个X轴

    我想创建一个具有双 X 轴 m s 和 km h 且具有相同绘图的 Matlab 图 我已经找到了plotyy和 在Matlab存储库中 plotyyy 但我正在寻找 双 X 轴 下面一起来看看剧情吧 我的代码很简单 stem M 1 3
  • Android - 读取类内的 build.gradle 属性

    我希望能够访问 build gradle 属性 以便我可以自动化应用程序中的某些流程 这是我目前的结构 根项目 build gradle buildscript ext buildTools 25 0 2 minSdk 16 compile
  • iPhone模拟器中有切换深色模式和浅色模式的键盘快捷键吗?

    我使用 iPhone 模拟器进行开发 大多数 ui 组件都是使用 swift 编写的 有没有一种简单的方法可以在暗模式和亮模式之间切换以进行测试 我发现从设置中启用和禁用暗模式非常耗时 这个快捷方式将加快我对深色模式和浅色模式的测试 我最近
  • 发挥框架2.0的演变并创建触发器

    我一直在尝试使用 Play 2 0 3 创建此触发器 如果我手动运行它 它在 MySQL 中运行得很好 但当尝试从 Play 运行它时 它会失败 delimiter create trigger company updated before
  • Java 反射和重构中的痛苦

    Java Reflection 提供了一种在运行时自省对象的机制 毫不犹豫 这是一个很棒的功能 但它打破了所有重构约定 没有简单的方法 除了File Search 甚至在现代 IDE 中也能知道引用了哪个属性以及在哪里引用 这使得重构变得更
  • apache,允许文件名带有“?”

    我想制作网站的静态副本 保留现有的 URL 问题是 URL 看起来像 http mysite index php id XXX http mysite index php id XXX Apache 不想找到文件 index php id
  • 如何知道Android是否连接到WiFi或以太网? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 How to know whether I m connected to WiFi or ethernet in Android In
  • 使用一种编译器创建的静态 C 库是否与另一种编译器兼容?

    就我而言 我有一个使用代码源 gcc 构建的库 目标是arm cortex m4 然后我尝试将该库链接到使用 IAR 编译器编译的项目中 是否可以做到这一点 或者是否必须使用新工具重建库 哪些因素影响这个 静态库是几个目标文件的捆绑 这些目
  • Seaborn 散点图将气泡大小缩放为更大的点

    我正在关注这个example https seaborn pydata org generated seaborn scatterplot html我想创建更大的气泡 但无论我将尺寸列乘以多大 它们仍然很小 是否需要调整某种比例因子 我在文
  • 为什么这个 IFrame 没有占据完整的页面高度? [复制]

    这个问题在这里已经有答案了 我正在使用 Iframe 来显示 google com 或说任何网站 我使用了 height 100 但即便如此 我的 Iframe 大小也只是页面的一半 请让我知道为什么会发生这种情况 链接在这里 http j
  • Spark:测试 RDD 是否为空的有效方法

    没有一个isEmptyRDD 上的方法 那么测试 RDD 是否为空的最有效方法是什么 RDD isEmpty https issues apache org jira browse SPARK 5270将成为 Spark 1 3 0 的一部