团队,
我有一个问题,有两个表(临时)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。。。do设置
set mapreduce.input.fileinputformat.split.maxsize=71582788;
set mapreduce.input.fileinputformat.split.minsize=71582788;
但也没有运气。有什么想法。。。或者任何帮助。。非常感谢。谢谢。
1条答案
按热度按时间vuktfyat1#
这东西是你的
LEFT JOIN
实际上是cross
如果没有ON
条件,它复制了行b x a,2874561x127 = 365M
,则生成太多行WHERE
仅筛选满足条件的行:A.DATE BETWEEN B.ALLOW_D AND B.SEL_D
.尽量减少右表中的行数。假设您知道表a中的最短日期是2018-01-01,请将其用作表b的筛选器(在使用join之前使用子查询)
WHERE B.ALLOW_D>='2018-01-01'
). 如果你能替换BETWEEN
带相等连接ON
条件。加入前的聚合和筛选比交叉加入+筛选便宜。尝试增量加载并在联接之前减少行数。