如何在使用多个大表时优化Hive中的联接性能

时间:2018-10-05 07:31:54

标签: sql hive

我们在Hive中使用了多个大表和小表。我们需要执行多个INNER JOIN,但是即使3小时后,我的加入执行仍无法完成。我使用了一种技术,最后需要使用大表。
我的示例代码如下:

SELECT 
    a.name,
    a.qual,
    a.year
FROM emp 1 a
    INNER JOIN emp2 b
        ON trim(a.qual) = (b.qual)
    INNER JOIN emp3 c
        ON trim(a.qual) = (c.qual)
    INNER JOIN emp4 d
        ON trim(c.year) = (d.year)
    INNER JOIN emp5 e
        ON trim(a.qual) = (e.qual)
AND trim(d.marks) = (e.marks)
GROUP BY 
    a.name,
    a.qual,
    a.year;

emp1 = count 5677
emp2 = count 7890900
emp3 = count 8755788
emp4 = count 78524565
emp5 = count 875684265

以上表格具有名称,年龄,月份,质量,年份的架构。 这些不是实际的表。仅出于逻辑考虑,我已重命名了表名和列名。我的实际逻辑和表计数几乎相同。

1 个答案:

答案 0 :(得分:0)

您没有过滤主表emp1中的任何行。在这种情况下,全表扫描是此表的最佳解决方案。它有5k行,所以无论如何它都不是问题。

但是,在相关表上,您可能需要在访问索引时使用索引。我会尝试:

create index ix1 on emp5 (qual);

create index ix2 on emp4 (year);

create index ix3 on emp3 (qual);

create index ix4 on emp2 (qual);

这些索引应该可以大大提高连接性能,但是仍然取决于您实际上从每个表中选择多少行。

如果这没有帮助,那么您将需要检索查询的执行计划。如果您将其发布,那么我们可以帮助您阅读它。

此外,修复数据模型,清理数据并删除正在使用的trim()函数也是一个好主意。不过,对于此查询而言,它似乎并不重要,因为无论如何在这种情况下,嵌套循环联接(NLJ)都应该有效地工作。

祝你好运。