了解下SparkSQL中的笛卡尔积

        虽然应该尽量避免使用笛卡尔积,因为要全量匹配,所以运算的效率十分低下,但是有些业务有必须得用,所以在此了解下SparkSQL中的笛卡尔积。

        SparkSQL中计算笛卡尔积时有两种Join方式:Cartesian Join 和 Broadcast Nested Loop Join。其中 Broadcast Nested Loop Join 是默认的 Join 机制,它可以用来进行任意条件任意类型的 Join。

Cartesian Join:

    该种方式的执行其实就是RDD操作中的cartesian。最终partition的数量是两个RDD partition数量的乘积。它是遍历partition进行计算的,所以会产生巨量多的Task

     SparkSQL对此进行了优化,对右边的数据进行了cache,以便加快计算速度,计算的原理是一致的:

 cache就是标红的地方,把数据放到rowArray结构中:

 

 Broadcast Nested Loop Join:

    选择BNLJ时,优先通过hints判断到底要广播哪一侧的表。如果没有hints的时候,再通过大小比较,广播小一侧的表:

     Join的流程很简单,以Inner Join为例,就是逐条匹配,然后按条件过滤。可以理解为Join的流程就是双重的for循环:

    for(x in ***){

        for(y in ***){

           x match y 

    }

}

参考:

        spark2.4 `Inner join`被“优化”成`CartesianProduct` 

        Spark Catalyst 进阶:Join - Robert Peng's Blog

        https://www.jianshu.com/p/fb8b792a7a9b

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值