在 apache Spark 中替换 groupByKey 的方法

2024-02-21

我想知道更换的最佳方法按键分组与另一个操作。

基本上我想获得一个RDD[(int,列表[测量]), 我的情况:

// consider measures like RDD of objects
measures.keyBy(_.getId)
        .groupByKey

我的想法是使用按键减少相反,因为它会导致更少的随机播放:

measures.keyBy(_.getId)
        .mapValues(List(_))
        .reduceByKey(_++_) 

但我认为效率非常低,因为它迫使我实例化大量不必要的 List 对象。

任何人都可以有其他想法来替换 groupByKey 吗?


另一种方法是使用aggregateByKey,专门用于将值组合成与原始值不同的类型:

measures.keyBy(_.getId)
        .aggregateByKey(List[Measure]())(_ :+ _, _ ++ _)

这会为每个分区中的每个键创建一个空列表,将所有值附加到每个分区中的这些值,然后最后打乱列表以连接每个键的所有值。

在 Scala 中向列表追加是 O(n),最好是在前面添加,即 O(1),但看起来不太干净:

measures.keyBy(_.getId)
        .aggregateByKey(List[Measure]())(_.+:(_), _ ++ _)

or:

measures.keyBy(_.getId)
        .aggregateByKey(List[Measure]())((l, v) => v +: l, _ ++ _)

这可能比你的更有效率reduceByKey示例,但情况reduceByKey and aggregateByKey远远优于groupByKey您可以首先大幅减少数据大小,然后仅对较小的结果进行打乱。在这种情况下,您没有这种减少:中间列表包含您开始使用的所有数据,因此当组合每个分区列表时,您仍在对完整数据集进行洗牌(这对于使用reduceByKey).

此外,正如 Zero323 指出的那样,groupByKey在这种情况下实际上更有效,因为它知道正在构建所有数据的列表,并且可以专门为此执行优化:

  • 它禁用映射端聚合,从而阻止使用所有数据构建大哈希映射
  • 它使用智能缓冲区(CompactBuffer),与逐一构建不可变列表相比,这显着减少了内存分配量。

另一种情况是两者之间的差异groupByKey and reduceByKey or aggregateByKey当键的数量不比值的数量少很多时,可能是最小的。

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

在 apache Spark 中替换 groupByKey 的方法 的相关文章

随机推荐

  • 无法连接到远程 SQL 服务器

    我的一个客户给了我一个完全合格的服务器名称 servername somedomain net尝试通过 VPN 连接到其 SQL Server 实例 所以我尝试使用他们给我的用户名和密码 没有运气 我可以 ping 通但无法连接 收到用户名
  • 如何将 float* 数组绑定到 cuda 中的一维纹理?

    我试图了解如何通过将纹理内存绑定到线性设备数组 而不是 cudaArray 来使用它 我的代码很简单 如下 我有一个包含 8 个数字的 float 数组 我试图将其绑定到 1D 纹理 然后在我的内核函数中尝试读取纹理并将值放入输出数组中 但
  • Typescript 和 Google 关闭

    我使用 Typescript 命令 tsc 创建一个包含所有平台类的 Javascript 文件 tsc Main ts out script myProject debug js declarations 然后 我想用 Google Cl
  • 将 Android Studio 更新到 2020.3.1 Canary 14 Build 后未解决的 Kotlin 引用

    我目前遇到 Android Studio 警告我某些不存在的 Kotlin 函数 我认为这是 Android Studio 唯一的问题 因为我可以很好地编译和运行我的项目 例如Android Studio无法识别val rows mutab
  • 如何使用 ASP.NET 5 注册 OData

    我有一个 ASP NET 5 应用程序 我想将 OData v4 与它一起使用 这是我尝试过的 1 我导入了以下nuget包 Microsoft AspNet WebApi 5 2 3 Microsoft AspNet OData 5 7
  • Mapbox 中路线的多色折线

    我用我的应用程序记录路线 主要是摩托车路线 并希望根据路线每个点的速度为其着色 基本上我知道如何在 Mapbox 中做到这一点 这就是问题所在 由于您只能为一条折线设置颜色 因此我必须将速度部分中的路线分开 并使用其特定的颜色打印每个路线部
  • WSO2ESB 4.5.1 axi2 属性 ssl.client.auth.cert.X509 始终为 NULL

    当使用NIO SSL监听器 org apache synapse transport nhttp HttpCoreNIOSSLListener 时 没有HttpServletContext不再可用 显然 因此深入研究可能解决我发现的客户端证
  • 如何在 aws elastic beanstalk 环境实例启动上运行 shell 脚本

    我正在使用 Terraform 脚本创建 aws elastic beanstalk 环境 我需要在实例启动时启动 shell 脚本 我已经尝试过以下操作 resource aws elastic beanstalk environment
  • 无边框 TabControl wpf (XP)

    我在 WPF 中设置 TabControl 样式时遇到视觉问题 因此 即使我将选项卡控件的边框设置为 0px 且透明 右侧和底部边框上仍然有一条非常细的线 我没有找到可以解决这个问题的属性 所以也许有人遇到了同样的问题并可以分享 提前致谢
  • LibGDX指导-精灵追踪2D无限随机贝塞尔曲线

    我已经能够将平滑的动画应用于我的精灵并使用加速度计控制它 我的精灵固定为沿 x 轴左右移动 从这里开始 我需要弄清楚如何创建一条垂直的无限波浪线供精灵尝试追踪 我的游戏的目的是让用户用加速度计控制精灵的左 右移动 试图尽可能地追踪永无止境的
  • MVC4 部分视图中的淘汰赛绑定

    简而言之 我相信我所追求的是一种在 MVC4 部分视图中为剔除绑定 javascript 对象提供范围 上下文的方法 这样我就可以重用相同的部分而不会让它们互相干扰 但仍然能够在客户端引用父子视图模型 作为一个出色的菜鸟 更广泛地说 是真正
  • 查找 html 块中最宽单词的宽度

    目标是找到这里最宽单词的宽度 文本是由不同字体的单词组成的句子 如图所示 the html looks like span style font bold 14px Verdana LONGESTW span span style font
  • WSO2 API Manager - 移动应用程序如何连接到 API Manager?

    我们有一个移动应用程序 需要通过 WSO2 API Manager 来访问一些 API 由于oauth2身份验证 我们需要在移动应用程序中存储用户名和密码 安全吗 例如 可以使用用户名和密码登录API Store 对于这种情况有其他解决方案
  • Rails cron 与无论何时,设置环境

    如果您了解用于创建 cron 作业的whengem 这个问题可能才有意义 我的 Schedule rb 中有一个任务 例如 every 1 day at gt 4am do command cd RAILS ROOT rake thinki
  • SQL Server 存储过程能否以比其调用者更高的权限执行?

    我们的 SQL Server 数据库具有报告功能 允许调用者读取但不能写入任何表 因为用户 或者更准确地说 代表用户操作的 Web 应用程序打开的连接 仅具有以下数据读取器权限 数据库 我们希望能够编写一个存储过程 它是一个特殊的 清理报告
  • 为什么使用setTimeout函数会立即执行?

    我正在尝试编写简单的代码setTimeout 但是setTimeout只是不会等待它应该等待的时间并且代码会立即执行 我究竟做错了什么 setTimeout testfunction 2000 您将立即调用该函数并安排其返回值 Use se
  • 神秘的阴谋集团安装问题

    全新安装 Haskell Platform OS X Snow Leopard Platform 2010 1 0 1 这样做会导致简单的序列导致非常奇怪cabal install行为 cabal install time cabal in
  • 如何在 Visual Studio C++ Express 版本中启用自动完成功能?

    请指导我 如何在 VS C 中启用自动完成功能 通过自动完成 我的意思是 当我在控件名称后面加点时 编辑器应该显示一个下拉菜单以供选择 谢谢 开始写作 然后只需按 CTRL SPACE 即可
  • 如何在 Heroku.com 上托管的 Redmine 上安装插件

    刚刚把redmine推送到heroku平台 虽然我无法让积压插件工作 但它在本地工作得很好 我已将本地数据库推送到heroku aswwell Heroku 的公共目录不可写 但默认的 Redmine 假设 要求如此 因为在应用程序服务器启
  • 在 apache Spark 中替换 groupByKey 的方法

    我想知道更换的最佳方法按键分组与另一个操作 基本上我想获得一个RDD int 列表 测量 我的情况 consider measures like RDD of objects measures keyBy getId groupByKey