我们在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
以上表格具有名称,年龄,月份,质量,年份的架构。 这些不是实际的表。仅出于逻辑考虑,我已重命名了表名和列名。我的实际逻辑和表计数几乎相同。
答案 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)都应该有效地工作。
祝你好运。