【问题标题】:Left join taking longer time to execute左连接需要更长的时间来执行
【发布时间】:2019-02-05 13:49:22
【问题描述】:

我有一个问题,有 2 个表(临时)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;

但没有运气。

【问题讨论】:

    标签: sql join hive hiveql


    【解决方案1】:

    问题是你的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 的过滤器(在与 WHERE B.ALLOW_D>='2018-01-01' 连接之前使用子查询)。理想情况下,如果您可以将 BETWEEN 替换为相等连接 ON 条件。加入前的聚合和过滤可能比交叉连接 + 过滤便宜。

    尝试增量加载并减少加入前的行数。

    【讨论】:

    • 非常感谢您的回复。表 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 函数?您能否分享一些示例,如何过滤此临时表以便在与 A 表连接时可以使用 between 子句?...请帮助...
    • @Ma28 是的。作为第一步,从主(左)表中选择 min(A.DATE) 作为 min_dt 和 max(A.DATE) 、 max_dt 日期。现在您可以使用这些值来过滤您的右表,例如 (select * from b where B.ALLOW_D>= min_dt and B.SEL_D
    • 但是恕我直言,架构出了点问题。非等式连接对 Hive 不利。没有 ON(交叉)与大表的连接是你能做的最糟糕的事情。想想如何重新设计架构,您将完全消除这种连接。
    • 并且没有 ON 的加入是 CROSS。使用交叉连接。更好地理解代码的实际作用
    猜你喜欢
    • 2012-03-17
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    相关资源
    最近更新 更多