Distribute By vs Shuffle in SparkSQL Query Join



我相信在 Spark 中,当两个表之间存在JOIN时,两个表都分布到同一连接键上的分区,以共同定位数据(来自两个表(以查找匹配项。如果我没记错的话,这个动作叫做SHUFFLE

但是,我也读到有一个DISTRIBUTE BY子句,可以在 sql 查询中使用,也可以通过指定的键预分发数据。因此,从逻辑上讲,在联接之前对联接表使用distribute by也将给出与普通洗牌相同的结果。

例如:

create or replace temporary view cust AS
select id, name
from customers
distribute by id;
create or replace temporary view prods AS
select id, pname
from products
distribute by id;
select a.id, a.name, b.pname
from cust a
INNER JOIN prods b
ON a.id = b.id

那么,如果distribute by也分发数据以在两个表中共同定位数据,那么它与Shuffle有何不同?distribute-by可以消除shuffle吗? 此外,如何利用distribute by/cluster by来提高查询性能。

如果可能,请分享一个例子。

任何人都可以澄清一下。

从手册:

分发者

基于一组表达式对关系中的行进行重新分区。具有相同表达式值的行将被哈希为相同的 工人。您不能将其与 ORDER BY 或 CLUSTER BY 一起使用。

它相当于同样的事情。 即发生洗牌,也就是说你不能消除它,只是替代接口。当然,只有由于采用了"懒惰"评估才有可能。

最新更新