apache-spark - Spark忽略加入中的显式广播提示
问题描述
在调查 spark 作业的性能时,我在 Spark UI SQL DAG 视图中注意到正在执行 SortMergeJoin 而不是预期的 BroadcastHashJoin。
代码看起来像这样:
val df1 = // Some DataFrame
val df2 = // Some DataFrame
def df2Selected =
df2
.select(...)
df1
.join(
broadcast(df2Selected),
// join clause,
"left_outer"
)
但是 - 如果我修改 df2Selected 以添加coalesce(1)
并重新运行,那么我会看到预期的 BroadcastHashJoin。
def df2Selected =
df2
.select(...)
.coalesce(1)
谁能告诉我这里发生了什么以及我是否可以在不合并的情况下强制广播?
我敢打赌,coalesce 以某种方式允许 Spark 推断从 df2Selected 返回的 DataFrame 的大小,因此 Spark 将允许广播。
解决方案
Broadcasthashjoin 不适用于左外连接和全外连接。这是有充分理由的,如果有 2 个执行程序,可以说较小表中的 1 行不匹配,那么它应该在右侧带有空值的结果中吗?它不会在 Executor1 上知道 Executor2 上是否有匹配对,它无法在本地决定。
推荐阅读
- javascript - Web:如何重定向到填充信息的 CodePen 或 JsFiddle?
- linux - 如何使用从 Dymola 导出的源代码 FMU 为 Linux 64 位生成二进制文件。(交叉编译Windows到Linux)
- c# - 仅返回指定目录中的重复文件
- python-3.x - Heroku Discord Bot 构建但在部署时无法工作
- powershell - Sharepoint Net Webclient通过powershell输出检索总是HTML
- python - API Call Statistics Sweden SCB, No values displayed
- java - Micronaut FunctionInitializer 覆盖应用程序属性
- maxima - 如何检测 Maxima 中的内置函数?
- python - Monkey 修补 Python 中另一个模块的对象
- amazon-web-services - AWS ELB - 目标群体健康但无法访问