Spark SQL 广播哈希连接

2024-04-16

我正在尝试使用 SparkSQL 对数据帧执行广播哈希连接记录在这里 https://spark.apache.org/docs/latest/sql-performance-tuning.html#join-strategy-hints-for-sql-queries.

在该示例中,(小)DataFrame通过 saveAsTable 持久化,然后通过 Spark SQL 进行连接(即通过sqlContext.sql("..."))

我遇到的问题是我需要使用 SparkSQL API 来构建我的 SQL(我需要用 ID 列表连接约 50 个表,并且不想手动编写 SQL)。

如何通过 API 告诉 Spark 使用广播哈希连接?问题是,如果我加载 ID 列表(通过持久化的表)saveAsTable) 变成DataFrame要在连接中使用,我不清楚 Spark 是否可以应用广播哈希连接。


您可以明确标记DataFrame小到足以进行广播 使用broadcast功能:

Python:

from pyspark.sql.functions import broadcast

small_df = ...
large_df = ...

large_df.join(broadcast(small_df), ["foo"])

或广播提示(Spark >= 2.2):

large_df.join(small_df.hint("broadcast"), ["foo"])

Scala:

import org.apache.spark.sql.functions.broadcast

val smallDF: DataFrame = ???
val largeDF: DataFrame = ???

largeDF.join(broadcast(smallDF), Seq("foo"))

或广播提示(Spark >= 2.2):

largeDF.join(smallDF.hint("broadcast"), Seq("foo"))

SQL

您可以使用提示(火花 >= 2.2 https://issues.apache.org/jira/browse/SPARK-16475):

SELECT /*+ MAPJOIN(small) */ * 
FROM large JOIN small
ON large.foo = small.foo

or

SELECT /*+  BROADCASTJOIN(small) */ * 
FROM large JOIN small
ON large.foo = small.foo

or

SELECT /*+ BROADCAST(small) */ * 
FROM large JOIN small
ON larger.foo = small.foo

R(火花R):

With hint(火花 >= 2.2):

join(large, hint(small, "broadcast"), large$foo == small$foo)

With broadcast(火花 >= 2.3)

join(large, broadcast(small), large$foo == small$foo)

Note:

如果其中一个结构相对较小,则广播连接很有用。否则它可能比完全洗牌要贵得多。

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

Spark SQL 广播哈希连接 的相关文章

随机推荐

  • 使地图或列表在 Web UI 中可观察

    我可以通过在 Dart 代码中使用 observable 声明来使 String 或 num 类型可观察 observable var x and html 中的语法 div x x div But observable不适用于列表和地图
  • Web 部署任务在 Web 部署中失败

    我在将网站部署到域时遇到问题 它是在线的 但正在使用实体框架复制数据库中的条目 我删除了它以重新分配离线网站 但当我部署时出现错误 我尝试清理解决方案并重建 但它不起作用 它在部署时抛出异常 Web 部署任务失败 未知的 ProviderO
  • 这是向 Cocoa 中的 NSCombobox 添加项目的正确方法吗?

    我是 Delphi 程序员 对 Cocoa 很陌生 起初我尝试了这个 void awakeFromNib int i NSString mystr for i 1 i lt 24 i comboHour addItemWithObjectV
  • Oracle:如何调用重载过程?

    如何正确拨打电话DBMS OBFUSCATION TOOLKIT DESEncrypt 如果可能 不使用 PL SQL select DBMS OBFUSCATION TOOLKIT DESEncrypt x y from dual 不起作
  • 如何shell到另一个应用程序并让它以delphi形式出现

    在 Delphi 中 我多年来一直使用 ShellExecute 来启动 并可选择等待 其他应用程序 但现在 我需要让这些应用程序之一出现在我的 Delphi 应用程序表单之一中 我尝试使用下面的代码作为一个简单的测试来打开记事本 它会这样
  • 制作一个 JPanel 正方形

    如果我有一个包含多个子组件的 JPanel 我该如何制作才能使 JPanel 保持正方形 无论其父组件的大小如何调整 我尝试了以下代码的变体 但它不会导致子组件也是正方形的 public void paint Graphics g if t
  • Pandoc Filter 为链接添加脚注

    我只是想问是否有人知道 Pandoc 的一个简短过滤器 可以自动向任何链接添加脚注 我只想在我的打印文档中有可读的链接源 所以为了指定 我想从 link url 对于类似的东西 link url link url 因此 在打印的 PDF 中
  • 在 ASP Classic 中注释代码

    我所知道的散列代码的方式ASP经典版 http en wikipedia org wiki Active Server Pages is 这是正确的吗 或者还有别的办法吗 使用单引号 例如 This is comment ASP 经典使用V
  • 检测可移动驱动器(例如 USB 闪存驱动器)C/C++

    如何检测可移动磁盘驱动器何时与系统连接 断开 如何获取挂载路径 对于Linux 和驱动器号 对于Windows 编辑 有没有办法检测当前连接的设备 对于 Windows API注册设备通知 http msdn microsoft com e
  • 如何管理视图控制器可能无休止地推送到导航控制器堆栈上的情况? iOS系统

    我有一个由 UINavigationController 组成的应用程序 它从 3 个不同的选项卡推送 ViewController 我预见到的麻烦是当前的结构允许用户无休止地将 VC 添加到堆栈中 我有一个称为药物的选项卡 另一个称为病原
  • 如何在不使用 BOM 且以非 ASCII 字符开头的情况下识别文件的不同编码?

    我在尝试识别不带 BOM 的文件的编码时遇到问题 特别是当文件以非 ASCII 字符开头时 我发现以下两个关于如何识别文件编码的主题 如何在不使用 BOM 的情况下识别不同的编码 https stackoverflow com questi
  • 添加到画布后更改文本

    在fabric js中 我正在制作矩形组和文本字段 然后将其添加到画布中 我正在使用以下代码 但是一旦将文本字段添加到画布中 我可以更改文本字段的文本吗 我做了小提琴请检查 http jsfiddle net HAb4N 5 http js
  • Webflux multipart/form-data,启用 csrf,有或没有文件上传获取无效的 CSRF 令牌

    禁用 csrf 后 我可以上传文件 但我需要启用它 仅当表单 enctype 为 multipart form data 时 即 无效的 CSRF 令牌 为 403 时 才会出现此问题 一般来说 当我将 enctype 设置为 multip
  • Jersey 2.0 和 Moxy 内部服务器错误但没有服务器日志

    我遵循了 Jersey 2 0 文档 https jersey java net documentation latest user guide html json moxy https jersey java net documentat
  • jQuery:Gmail 之星?

    我想知道是否有人有关于创建 Gmail 收件箱明星 最喜欢的 的任何好的教程 EDIT 我想我想创建一些类似于 stackoverflow star 或 gmail inbox star 的东西 我有一组列表项 我在其中添加了多个控件 一个
  • 为什么我无法加载 Nokogiri?

    我通过运行以下命令安装了 Nokogiri 没有任何问题 sudo gem install nokogiri Building native extensions This could take a while Successfully i
  • 如何通过 JSch java api 执行 linux 命令“dzdo su - john”并在该用户上执行一些命令,例如“ls -ltr”

    我想使用 java jsch 库连接到远程 Linux 服务器 并使用命令 dzdo su john 切换到另一个用户 并且我想对该用户执行一些命令 我已经尝试了几种方法来满足这一要求 但我无法做到这一点 任何人都可以提供帮助 public
  • OUTPUT INTO 子句中可以使用哪些列?

    我正在尝试构建一个映射表 将表中新行的 ID 与从中复制的行关联起来 OUTPUT INTO 子句似乎对此很完美 但它的行为似乎并不符合文档 My code DECLARE Missing TABLE SrcContentID INT PR
  • 如何检查淘汰赛中的包含

    我正在使用淘汰赛 我有一个 html 页面 我想在其中检查具有某些值的字符串 就像我有一个字符串 A B C D F G H I 一样 我只想用剔除 if 检查 html 中的这个字符串 模型 var viewModel function
  • Spark SQL 广播哈希连接

    我正在尝试使用 SparkSQL 对数据帧执行广播哈希连接记录在这里 https spark apache org docs latest sql performance tuning html join strategy hints fo