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。 (between
是colA >= colB and colA <= colC
)
Impala 的主要特点之一是读取数据时非常快。
所以基本上,是的,与 Impala 相比,Hive 速度较慢,您对此无能为力。就是这样。
另外,您正在对左连接进行计数,这意味着,如果没有重复,则输出将是 A 中的行数。所以也许,您不需要连接 ...
【讨论】:
感谢您的回复。是的,我的查询中需要有非 equi 连接。我正在桌子上做一个选择*而不是计数。我只是在这里举个例子。有什么方法可以让这个查询在 pyspark spark.sql 上运行得更快? @SawanS 当然,使用 spark 应该更快。但 spark 也喜欢 equi-joins。试试看结果,我们不能为你做,我们没有你的数据。以上是关于HIVE 加入时间太长,但在 Impala 上速度很快的主要内容,如果未能解决你的问题,请参考以下文章
Hive 和 Impala 之间的正则表达式的语法是不是不同?