HIVE 加入时间太长,但在 Impala 上速度很快

Posted

技术标签:

【中文标题】HIVE 加入时间太长,但在 Impala 上速度很快【英文标题】:HIVE join taking too long, but is fast on 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 ;

【问题讨论】:

这能回答你的问题吗? How does impala provide faster query response compared to hive 【参考方案1】:

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

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

在此处查看如何配置 map-join:https://***.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。试试看结果,我们不能为你做,我们没有你的数据。

以上是关于HIVE 加入时间太长,但在 Impala 上速度很快的主要内容,如果未能解决你的问题,请参考以下文章

Hive 和 Impala 之间的正则表达式的语法是不是不同?

使用 SparkSQL 读取 Impala 表

Hive/Impala批量插入数据

Impala与Hive的优缺点和异同

如何在 impala 或 hive 上读取复杂类型数组<string>?

Hive 和 Impala 以及它们与 HDFS 的交互