分布式join和agg的实现方式

Join

单机join基本算法

1.Hash Join:
对数据没有要求,对SQL有要求,必须要有等值连接条件,例如t1.colA = t2.colB。OLAP一般都会实现Hash join,计算速度快,且用户的很多join场景都是带有等值连接条件的。

2.Merge Sort Join:
左表和右表的数据都是有序的,排序的列,是Join Key的子集,也就是Join Key部分列有序就可以。

3.Nestloop Join:
不要求数据有序,不要求SQL有等值连接条件。一般在数据无序且SQL中没有等值连接条件,此时无法使用上述的两种方法,才不得已使用此方法。效率最低,但适应范围最广,MySQL的最爱,在8.0.18之后才支持Hash Join,之前都是Nestloop Join,并且为了加速,还建了索引。
Flink的Interval join,用的是Nestloop Join方法,
在这里插入图片描述
在这里插入图片描述

分布式Join基本算法

与单机Join的区别是,需要先对数据进行重分布,重分布要在保证计算结果正确的前提下,优先提升计算速度,尽

Spark SQL 中的 Sort-Merge Join 是一种常见的基于磁盘的 join 算法。它利用 Spark 的分布式计算能力和磁盘存储,适用于大规模数据集的 join 操作。下面简单介绍一下如何使用 Spark SQL 中的 Sort-Merge Join。 假设我们有两个数据集,一个是 orders 表,包含订单信息,另一个是 customers 表,包含客户信息。我们想要通过这两个数据集中的共同字段 customer_id 进行 join 操作。 首先,需要将两个数据集分别进行排序,按照 customer_id 字段进行升序排序。可以使用 Spark SQL 中的 sort() 函数进行排序: ```scala val sortedOrders = spark.sql("SELECT * FROM orders ORDER BY customer_id") val sortedCustomers = spark.sql("SELECT * FROM customers ORDER BY customer_id") ``` 接下来,可以使用 Spark SQL 中的 join() 函数进行 join 操作。需要注意的是,join() 函数默认使用的是 Hash Join 算法,需要通过设置参数 spark.sql.join.preferSortMergeJoin=true 来启用 Sort-Merge Join 算法。 ```scala spark.sql("SET spark.sql.join.preferSortMergeJoin=true") val joinedData = sortedOrders.join(sortedCustomers, Seq("customer_id"), "inner") ``` 以上代码中,Seq("customer_id") 指定了 join 操作所使用的共同字段。"inner" 表示使用内连接。 最后,可以对 joinedData 进行操作,例如进行聚合操作: ```scala val result = joinedData.groupBy("customer_id").agg(sum("order_total")) ``` 以上就是使用 Spark SQL 中的 Sort-Merge Join 进行 join 操作的基本步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值