【问题标题】:HIVE join taking too long, but is fast on ImpalaHIVE 加入时间太长,但在 Impala 上速度很快
【发布时间】:2021-08-11 14:45:47
【问题描述】:

我有如下查询。此查询在 Impala 上运行 15 秒,但当我在 HIVE 上运行相同时,需要 10 多分钟。我必须将其他几个表加入到这个查询中(与下面类似的连接)并且它花费的总时间超过 1 小时(有时它会在一小时后失败/卡住),但在 Impala 上它在一分钟内运行。

您能否告诉我为什么会发生这种情况以及如何优化 hive 上的以下联接?

SELECT count(*)
FROM table_A A
LEFT JOIN table_B B ON cast(A.value AS decimal(5, 2)) BETWEEN B.fromvalue AND B.tovalue
AND A.date BETWEEN B.fromdate AND B.todate ;

【问题讨论】:

标签: hive impala non-equi-join


【解决方案1】:

检查查询计划并尝试配置mapjoin。

像您这样的 Theta 连接(非等式连接)是使用 Hive 中的 cross join + 过滤器实现的。如果是 Map join,它将工作得更快。

在此处查看如何配置 map-join:https://stackoverflow.com/a/49154414/2700344

再次检查查询计划并确保使用了 MapJoinOperator。

即使使用 mapjoin,Hive 也比 Impala 慢,但可以处理更大的数据集。

【讨论】:

    【解决方案2】:

    Hive 正在运行基本的 map reduce 任务(本质上非常慢)。
    此外,连接最适合使用 equi-joins (colA = colB),而且您没有执行任何 equi-joins。 (betweencolA >= colB and colA <= colC

    Impala 的主要特点之一是读取数据时非常快。

    所以基本上,是的,与 Impala 相比,Hive 速度较慢,您对此无能为力。就是这样。


    另外,您正在对左连接进行计数,这意味着,如果没有重复,则输出将是 A 中的行数。所以也许,您不需要连接 ...

    【讨论】:

    • 感谢您的回复。是的,我的查询中需要有非 equi 连接。我正在桌子上做一个选择*而不是计数。我只是在这里举个例子。有什么方法可以让这个查询在 pyspark spark.sql 上运行得更快?
    • @SawanS 当然,使用 spark 应该更快。但 spark 也喜欢 equi-joins。试试看结果,我们不能为你做,我们没有你的数据。
    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多