问题类似于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
答案 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秒)。
你可以玩一下,看看你是否达到了一个不会产生太多开销的计划,但很可能你运气不好,因为蜂巢不能很好地缩小它。