了解下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
    评论
在NumPy,可以使用`numpy.meshgrid`函数来计算两个数组的笛卡尔积。该函数接受两个一维数组作为输入,并返回两个二维数组,其一个数组包含了第一个输入数组的所有元素的复制,另一个数组包含了第二个输入数组的所有元素的复制。这两个数组的形状与输入数组的形状相同,可以通过转置操作将它们合并成一个二维数组,从而得到笛卡尔积。 以下是使用`numpy.meshgrid`函数计算笛卡尔积的示例代码: ```python import numpy as np x = np.array(\[1, 2, 3\]) y = np.array(\[4, 5\]) X, Y = np.meshgrid(x, y) cartesian_product = np.transpose(\[X.ravel(), Y.ravel()\]) print(cartesian_product) ``` 输出结果为: ``` \[\[1 4\] \[2 4\] \[3 4\] \[1 5\] \[2 5\] \[3 5\]\] ``` 这样,你就可以使用`numpy.meshgrid`函数来计算NumPy数组的笛卡尔积了。 #### 引用[.reference_title] - *1* [笛卡尔积 +运算](https://blog.csdn.net/y15520833229/article/details/122258704)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【python】生成笛卡尔积(交叉表)DataFrame和numpy](https://blog.csdn.net/w417950004/article/details/78437777)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值