【携程一面】大小表非等值连接是广播JOIN吗?

前言

此题是2025年10月携程最新的数据开发面试题,我查阅了一下《大数据开发面试笔记V7.0》,确实是没有!但是回答本题又有一定的难度,于是今天来给大家解析一下本题,并且会补充在面试笔记中(位于spark补充题第29题)

参考答案

非等值连接不是广播JOIN,而是广播嵌套循环JOIN,也叫 BroadcastNestedLoopJoin,虽然也会将小表广播到所有的executor上,不同于BroadcastHashJoin的是,在JOIN时会用大表的key在未排序的小表中进行逐一匹配,效率非常低下

示例说明

spark.sql(
  """
    |select 1 as id, "a" as name1
    |union all
    |select 2 as id, "b" as name1
    |union all
    |select 3 as id, "c" as name1
    |union all
    |select 4 as id, "d" as name1
    |union all
    |select 5 as id, "e" as name1
    |union all
    |select 6 as id, "f" as name1
    |""".stripMargin).createOrReplaceTempView("t1")

spark.sql(
  """
    |select 1 as id, "aa" as name2
    |union all
    |select 2 as id, "bb" as name2
    |union all
    |select 3 as id, "cc" as name2
    |union all
    |select 7 as id, "xx" as name2
    |""".stripMargin).createOrReplaceTempView("t2")

等值连接

spark.sql(
  """
    |select *
    |from t1
    |left join t2
    |on t1.id = t2.id
    |""".stripMargin).show(false)

非等值连接

spark.sql(
  """
    |select *
    |from t1
    |left join t2
    |on t1.id != t2.id
    |""".stripMargin).show(false)

思考

大小表非等值连接如何避免使用BroadcastNestedLoopJoin呢?

#数据人的面试交流地#
大数据开发面试笔记 文章被收录于专栏

包括大数据篇、计算机语言篇、计算机基础篇、算法刷题篇、面试经验篇等五大篇章: 大数据篇包括框架原理、源码解析、调优技巧、大数据场景题、项目实战、数仓理论等模块;计算机语言篇包括Java、Linux、大厂常考SQL面试题等模块;计算机基础篇包括计算机网络、操作系统、数据库、数据结构等模块;算法刷题篇包括大厂高频算法题、刷题速成计划等模块 面试经验篇包括BAT、美团、字节、快手、京东等大厂的面经合集

全部评论

相关推荐

10-11 15:57
门头沟学院 Java
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 20:18
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务