1

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

你能告诉我为什么会发生这种情况以及我如何能够优化下面的蜂巢连接吗?

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 ;
4

2 回答 2

1

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

像您这样的 Theta 连接(非等式连接)是使用cross joinHive 中的 + 过滤器实现的。在地图加入的情况下,它将工作得更快。

请参阅此处如何配置 map-join:https ://stackoverflow.com/a/49154414/2700344 。

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

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

于 2021-08-11T15:11:41.437 回答
1

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

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

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


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

于 2021-08-11T15:08:45.123 回答