如何解决盐化技术可解决Spark SQL中的偏斜
我试图了解Salting
的技术来解决Spark SQL中的Skew
。我已经完成了一些在线阅读,并在Spark SQL API中提出了一个非常基本的实现。
让我们假设table1
偏向cid=1
:
表1:
cid | item
---------
1 | light
1 | cookie
1 | ketchup
1 | bottle
2 | dish
3 | cup
如上所示,cid=1
比其他键出现的次数更多。
表2:
cid | vehicle
---------
1 | taxi
1 | truck
2 | cycle
3 | plane
现在我的代码如下:
create temporary view table1_salt as
select
cid,item,concat(cid,'-',floor(rand() * 19)) as salted_key
from table1;
create temporary view table2_salt as
select
cid,vehicle,explode(array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19)) as salted_key
from table2;
最终查询:
select a.cid,a.item,b.name
from table1_salt a
inner join table2_salt b
on a.salted_key = concat(b.cid,b.salted_key);
在上面的示例中,我使用了20
个盐/裂片。
问题:
-
是否有任何经验法则可以选择最佳分割数 使用 ?例如如果
table1
有10 Million
条记录,我应该使用多少个垃圾箱/桶? (在这个简单的测试示例中,我使用了20
)。 -
如上所示,当我创建
Table2_salt
时,我正在对 盐,例如(0
,1
,2
,3
...到19
。有没有更好的选择 实现相同功能的方法,但是没有 硬编码和混乱? (如果我想使用100
拆分怎么办!) -
由于我们要复制第二张表(
table2
)N
次,这是否意味着它将降低Join性能?
注意:我只需要使用Spark 2.4 SQL API。
也请告诉我网上是否有任何高级示例。任何帮助表示赞赏。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。