配置单元:无法在左侧外部联接的右侧表上选择一个随机匹配项

hec6srdp  于 2021-06-29  发布在  Hive
关注(0)|答案(0)|浏览(239)

编辑-我不关心的倾斜或事情是缓慢的。我发现慢的原因更多的是在我的左外连接的许多比赛中多次连接。。。请跳到下面。
我有一个倾斜表的问题,也就是说,要连接的键比其他键多得多。我的问题是,我有一个以上的关键与许多行中的外观。
此表和我要加入的表的统计信息:较大的表:totalsize=47431500000,numrows=509500000,rawdatasize=47022050000 21052个不同键较小的表:totalsize=1154984612,numrows=13780692,rawdatasize=1141203920和39313个不同键
较小的表也有重复的键行。另一个挑战是我需要从较小的表中随机选择一个匹配的键。
到目前为止,我尝试了:

set hive.auto.convert.join=true;
set hive.mapjoin.smalltable.filesize=1155mb;

CREATE TABLE joined_table AS SELECT * FROM (
select * from larger_table as a 
LEFT OUTER JOIN smaller_table as b 
on a.key = b.key 
ORDER BY RAND()
)b;

它已经跑了一天了。
我想手动做一些类似的事情,但是,我有一个以上的关键是有一吨,所以我将不得不使一堆表和合并他们。如果这是我唯一的选择,我可以这么做
但我很想联系你们。
提前谢谢你的帮助
编辑6月20日我发现尝试:设置hive.optimize.skewjoin=true;设置hive.skewjoin.key=200000;我已经创建了几个单独的表来分离和连接出现最高的键,因此现在剩下的表中出现最高的键是200k。根据网络界面上的工作跟踪器显示,运行查询加入其余的人现在花了25分钟,成功地完成了所有任务。在hiveshell的命令行上,它仍然在那里,当我去检查时,表不存在。

**在大量阅读和尝试大量sql配置单元代码后编辑#2。。。理论上应该有效的1解决方案不起作用,特别是order by rand()从未发生过。。。

CREATE TABLE joined_table AS SELECT * FROM (
select * from larger_table as a 
JOIN 
(SELECT *, row_number() over (partition by key order by rand() )
from smaller_table) as b
on a.key = b.key 
and b.row_num=1
)b;

在结果中,它与第一行匹配,而不是rand()行。。
有没有其他的选择或者我做错了什么?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题