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

  • 本文关键字:Hive 优化 性能 大型 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

上面的表格具有名称、年龄、月份、资格、年份的架构。 这些不是实际的表。为了给出逻辑,我重命名了表名和列名。我的真实逻辑和表格计数几乎相同。

您没有从主表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( 在这种情况下应该有效地工作。

祝你好运。

最新更新