使用Scala对象作为key的reduceByKey

2023-12-28

我正在将 Spark 与 scala 一起使用,并且我有一个充满 tuple2 的 RDD,其中包含一个复杂对象作为键和一个 double 。目的是如果对象相同,则加倍(频率)。

为此,我将我的对象定义如下:

    case class SimpleCoocurrence(word:String, word_pos:String, cooc:String, cooc_pos:String, distance:Double) extends Ordered[SimpleCoocurrence]{
      def compare(that: SimpleCoocurrence) = {
        if(this.word.equals(that.word)&&this.word_pos.equals(that.word_pos)
           &&this.cooc.equals(that.cooc)&&this.cooc_pos.equals(that.cooc_pos))
          0
        else
          this.toString.compareTo(that.toString)
      }
    }

现在我尝试像这样使用reduceBykey:

val coocRDD = sc.parallelize(coocList)
println(coocRDD.count)
coocRDD.map(tup=>tup).reduceByKey(_+_)
println(coocRDD.count)

但是,结果表明,处理reducebykey之前和之后的RDD包含完全相同数量的元素。

如何使用 tuple2[SimpleCoocurrence,Double] 执行 reduceByKey ? 实现 Ordered 特征是告诉 Spark 如何比较我的对象的好方法吗? 我应该只使用 tuple2[String,Double] 吗?

thx,


reduceByKey不使用排序,但是hashCode and equals确定哪些键是相同的。特别是,hashPartitioner将按哈希对键进行分组,以便具有相同 hashCode 的键落在同一分区上,从而可以在每个分区上进一步减少。

案例类有一个默认实现equals and hashCode。可能使用的测试数据具有不同的字段值distance:Double使每个实例成为唯一的对象。使用它作为键将导致仅相同的对象被减少为一个。

解决这个问题的一种方法是为您的case class以及对象的添加方法,如下所示:

case class SimpleCoocurrence(word:String, word_pos:String, cooc:String, cooc_pos:String, distance:Double) extends Serializable {
   val key = word + word_pos + cooc + cooc_pos
}
object SimpleCoocurrence {
   val add: (SimpleCoocurrence, SimpleCoocurrence) => SimpleCoocurrence = ???
}

val coocList:List[SimpleCoocurrence] = ???
val coocRDD = sc.parallelize(coocList)
val coocByKey = coocRDD.keyBy(_.key)
val addedCooc = coocByKey.reduceByKey(SimpleCoocurrence.add)

(*) 作为指导示例提供的代码 - 未编译或测试。

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

使用Scala对象作为key的reduceByKey 的相关文章

随机推荐

  • 检测 iFrame 中的重定向

    我可能在这里问了错误的问题 所以我将提供一些关于我想要完成的任务的细节 我使用第三方网络应用程序来跟踪支持票证 他们提供了我的用户填写的表单的代码 并将其提交到他们的域 我想在两个不同的域上使用此表单 但不幸的是第三方使用单个硬编码的重定向
  • 如何解决 rmarkdown 中的此错误消息?

    我刚刚开始探索rmarkdown包裹 我不使用Rstudio 我使用默认的 R 环境 我所做的如下 我创建了一个新的 R 文档 开始输入几行rmarkdown格式 保存文件Rmd扩大 我将文件保存在工作目录中 我安装了pandoc使用 pk
  • 我需要在单击后退按钮时最小化 Android 应用程序

    我需要在按下后退按钮时最小化应用程序 我使用以下代码来捕获硬件后退按钮单击事件 帮助我最小化按后退键的代码 Override public boolean onKeyDown int keyCode keyEvent event switc
  • 数据实体 > 领域对象 > ViewModel,每个都有截然不同的数据结构

    这是关于数据实体 域对象和 ViewModel 之间映射的一般问题 我可能问得不对 但希望我能理解它 下面是一个简化的问题 假设我有一个实体框架模型 它 1 1 映射到我的数据库表 但我的域对象可能不相同 并且我的 ViewModel 又完
  • 与“LPCWSTR”类型的参数不兼容

    include stdafx h include
  • 在程序的某些部分显式禁用 MySQL 查询缓存

    在 Django 项目中 一些 cronjob 程序主要用于管理或分析目的 例如生成网站使用统计数据 轮换用户活动日志等 我们可能不希望MySQL在这些程序中缓存查询以节省内存使用并提高查询缓存效率 是否可以在这些程序中显式关闭 MySQL
  • 为什么我的 HTML 文本框在移动设备和桌面上的显示效果不一样?

    由于某种原因 我的 HTML 文本框没有居中 当我在桌面和移动设备上查看它们时 它们的显示方式有所不同 一个被拉伸 而另一个未居中 我可以让我的 HTML 代码在中显示相同吗 两种情况 div div h1 style text align
  • onload 和 Jquery read()。它们适用于任何 DOM 吗?比如table或者div?

    我需要使用 javascript 脚本将动态内容放在 div 上 该 div 位于页面顶部 因此它会先加载 然后再加载其下方的其他内容 而且下面真的有很多东西 因此 当我将脚本放在ready 或onload上时 div将空2 3秒 同时显示
  • 使用 jQuery 删除表格行

    以下是我的代码 Script document ready function click click function table append tr td nbsp td tr remove click function table re
  • 在同一个 Docker Hub 存储库中进行链式自动构建

    由于构建时间限制 https stackoverflow com a 34588866 865719在 Docker Hub 上 我决定拆分Dockerfile将耗时的自动构建分为三个文件 每一个 子构建 都会在 Docker Hub 的时
  • 为什么 sem_open 与 fork() 一起使用而不使用共享内存?

    即使信号量不在共享内存中 该程序也可以工作 我测试过 请注意我如何在 fork 之前创建一次变量 另一方面 用创建的信号量sem init 需要在共享内存中才能工作 但这仍然是一个sem t结构 那么为什么它不需要共享内存呢 的内容是sem
  • 如何删除字符串中除点和逗号之外的所有特殊字符

    我有一个包含许多特殊字符和文本的句子 我想删除除点和逗号之外的所有特殊字符 例如 这就是 u HI Jhon how are you 我正在尝试生成以下字符串 HI Jhon how are you 我试过这个 u HI Jhon how
  • Swagger/OpenAPI 多重安全要求和副作用?

    我正在为 Swagger OpenAPI 实现一个代码生成器 但是 我在实现安全要求时遇到了问题 这些要求被定义为对象列表 列表成员是替代 或 对象成员是与 例如 a b c d 这应该导致 a b 光盘 然而 在实现这一点时 我遇到了实际
  • .Net 中是否有与 java.util.concurrent.Executor 等效的程序?

    拥有一组长期运行的离散任务 从文本文件中解析数十 数千行 合并为对象 操作和持久化 如果我在 Java 中实现这一点 我想我可能会为文件中的每一行或每 X 行 即块 的任务添加一个新任务到执行器 对于我正在使用的 Net 我不太确定 我怀疑
  • Xcode iOS 框架图标含义

    当使用 Xcode 7 3 将 iOS 框架添加到 iOS 项目时 常规 gt 链接的框架和库 Xcode 使用两个不同的图标来表示 iOS 框架 一个看起来像一个白色立方体 另一个看起来像一个工具箱 这些图标分别代表什么意思 工具箱图标代
  • 信号 fft 的幅度错误

    我正在尝试计算使用 Python 进行快速傅立叶变换 我正在使用函数 fft fft 并将其应用于简单的正弦信号 这是我的代码 import numpy as np import matplotlib pyplot as plt frame
  • 在分块矩阵中查找一个值

    我写了一个稀疏矩阵类 基于Block压缩存储 我写了几乎所有的方法 但我不知道如何写方法findValue i j 给出原始矩阵的 2 个索引 存储由四个向量组成 ba 按从上到下左右顺序存储矩阵的非零块 几乎有一个元素不为零的矩形块 an
  • 如何让 mod_rewrite 只匹配一次规则

    我有以下网址 http localhost http mygarble com foundationsofwebprogramming 86 http localhost http mygarble com foundationsofweb
  • Excel公式最小值的位置

    编辑 可能是一个简单的问题 基本上我有三个值 比如说不同单元格中的 9 4 和 7 不在表中 我想找到订单中的最小值 然后返回其相对位置 例如 9 4 7 将返回 2 因为 4 是最小值并且位于第二位 正确的Excel公式是什么 谢谢 解决
  • 使用Scala对象作为key的reduceByKey

    我正在将 Spark 与 scala 一起使用 并且我有一个充满 tuple2 的 RDD 其中包含一个复杂对象作为键和一个 double 目的是如果对象相同 则加倍 频率 为此 我将我的对象定义如下 case class SimpleCo