Hive 左连接执行时间较长

Hive 左连接执行时间较长,hive,Hive,团队 我有一个问题,有两个表临时A和B,A有127行,B有大约2874561条记录 试着做 SELECT A.COL1, B.COL2 FROM A LEFT JOIN B WHERE A.DATE BETWEEN B.ALLOW_D AND B.SEL_D 。。。执行和运行mr 尝试了Tez和MAPJOIN,STREAMTABLE。。。定 set mapreduce.input.fileinputformat.split.maxsize=71582788; set mapreduc

团队

我有一个问题,有两个表临时A和B,A有127行,B有大约2874561条记录

试着做

SELECT A.COL1, B.COL2 
  FROM A LEFT JOIN B 
 WHERE A.DATE BETWEEN B.ALLOW_D AND B.SEL_D
。。。执行和运行mr

尝试了Tez和MAPJOIN,STREAMTABLE。。。定

set mapreduce.input.fileinputformat.split.maxsize=71582788;
set mapreduce.input.fileinputformat.split.minsize=71582788;
但也没有运气。任何想法。。。或者任何帮助。。非常感谢。谢谢。

问题是,您的左连接实际上像十字连接一样工作。如果它没有ON条件,它会复制行B x A,2874561x127=365M,产生太多行,然后只筛选满足条件的行:A.日期在B.ALLOW_D和B.SEL_D之间

尽量减少右表中的行数。假设您知道表A中的最短日期是2018-01-01,请将其用作表B的筛选器。在与其中的B.ALLOW_D>='2018-01-01'联接之前使用子查询。理想情况下,如果您可以在条件下用相等连接替换中间。加入前的聚合和筛选可能比交叉加入+筛选便宜


尝试增量加载,并在联接之前减少行数

非常感谢你的回复。表B是一个有点复杂的临时表,有许多表的并集,如select 1.allow_d,1.sel_d,1.col1 from 1 union all 2.allow_d,2.sel_d,2.col2 from 2 union all 3.allow_d,3.sel_d,3.col3 from 3 union all 4.allow_d,4.sel_d,4.col4 from 4。。。我不知道,条件是我需要过滤这个。。。可能类似于max 0r min函数?你能分享一些例子吗,我如何过滤这个临时表,以便在与表联接时可以使用between子句?。。请帮忙…@Ma28是的。第一步,从左主表中选择minA.DATE作为min_dt,选择maxA.DATE和max_dt DATE。现在,您可以使用这些值来筛选正确的表,如select*from b,其中b.ALLOW_D>=min_dt和b.SEL_D,但架构中存在严重问题。非相等联接不适合配置单元。在大表上没有交叉连接是最糟糕的。想一想如何重新设计架构,这样,您将完全消除这种连接。而不使用ON的连接是交叉的。使用交叉连接。为了更好地理解代码的实际功能