优化配置单元查询以避免加入

时间:2017-02-16 21:17:05

标签: hadoop hive hql

问题类似于this,但我想知道我是否可以在一个查询中执行此操作。这是我的工作,但我们都知道连接是昂贵的。有没有更好的hql来做这个?

select a.tbl1,b.tbl2
from
(
  select count(*) as tbl1 from tbl1
) a
join
(
  select count(*) as tbl2 from tbl2
) b ON 1=1

2 个答案:

答案 0 :(得分:2)

如果将它们保存为单独的列并不重要,可以使用UNION ALL操作来处理行格式:

select 'tbl1', count(*) from tbl1
UNION ALL
select 'tbl2', count(*) from tbl2;

这将允许您在以前的查询中避免使用额外的MAPJOIN运算符。从技术上讲,您可以在最终执行计划中减少一个映射器。

<强>更新

在Hadoop的最新发行版中,您不会在性能方面与UNION或MAP JOIN方法有太大差异,因为这些操作将在以前的作业中进行优化。但请记住,在旧版本的群集上或基于某些配置属性,MAPJOIN可以转换为单独的作业。

答案 1 :(得分:2)

是的,加入费用很高

如果说连接很昂贵,这通常是指在多个表中有许多记录需要相互匹配的情况。

根据该描述,您的加入并不昂贵,因为您只加入2套,每套1条记录。

但是,你必须看看开销

也许您会注意到,个别计数比您用来计算和组合结果的命令要短得多。这是因为map和reduce操作有很大的开销(每个阶段可能是30秒)。

你可以玩一下,看看你是否达到了一个不会产生太多开销的计划,但很可能你运气不好,因为蜂巢不能很好地缩小它。