我应该在配置单元中创建和删除中间表吗?
我可以写这样的东西(非常简单):
drop table if exists tmp1;
create table tmp1 as
select a, b, c
from input1
where a > 1 and b < 3;
drop table if exists tmp2;
create table tmp2 as
select x, y, z
from input2
where x < 6;
drop table if exists output;
create table output as
select x, a, count(*) as count
from tmp1 join tmp2 on tmp1.c = tmp2.z
group by tmp1.b;
drop table tmp1;
drop table tmp2;
或者我可以把所有的事情都写进一句话:
drop table if exists output;
create table output as
select x, a, count(*) as count
from (select a, b, c
from input1
where a > 1 and b < 3) t1
join (select x, y, z
from input2
where x < 6) t2
on t1.c = t2.z
group by t1.b;
显然,如果我多次重用中间表,那么创建它们是非常有意义的。但是,当它们只使用一次时,我有一个选择。
我两个都试过了,第二个比墙时间快6%,但比墙时间慢4% MapReduce Total cumulative CPU time
日志输出。这种差异可能在随机误差范围内(由其他过程引起)。然而,合并查询是否可能导致显著的加速?
另一个问题是:中间表(只使用一次)在配置单元代码中是正常出现的吗,还是应该尽可能避免使用它们?
4条答案
按热度按时间ha5z0ras1#
正如你所发现的,时间上可能没有什么大的差别。您很可能希望维护临时表,以便(a)“savepoint”/中间回滚或(b)进行故障排除。否则,记住(或自动化)中间表的清除/删除可能不值得管理人员付出努力。
wydwbb8l2#
我喜欢创建多个视图,然后只在末尾创建一个表。这允许hive优化器减少map reduce步骤的数量,并像dimamah和nigel指出的那样并行执行,但有助于保持非常复杂管道的可读性。
例如,你可以用
n3schb8v3#
有一个显著的区别。
运行一个大查询将允许优化器在优化方面有更多的自由。
在这种情况下,最重要的优化之一是中设置的并行优化
hive.exec.parallel
. 当设置为真Hive将EXEXCEX独立阶段平行。在您的例子中,在第二个查询中,想象t1,t2执行更复杂的工作,如
group by
. 在第二个查询t1中,t2将同时执行,而在第一个脚本中,t2将是串行的。xesrikrc4#
我认为合并查询是一件好事。它允许配置单元查询优化器优化查询。
考虑一下这个愚蠢的问题:
当您运行它时,hive将只启动一个mapreduce作业。
使用中间表
显然会运行两个mapreduce作业。
所以要回答你的问题:是的,合并查询可以加快速度。