优化配置单元查询以避免连接

oprakyz7  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(340)

问题与此类似,只是我想知道是否可以在一个查询中完成。这是我的工作,但我们都知道加入是昂贵的。有更好的办法吗?

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

oymdgrw71#

是的,连接很贵

如果说连接是昂贵的,这通常是指在多个表中有许多记录需要相互匹配的情况。
根据这个描述,你的加入并不昂贵,因为你只加入两个集,每个集有一个记录。

但是,你一定在看头顶

也许您注意到,单个计数所用的时间比用于计数和合并结果的命令要短得多。这是因为map和reduce操作有很大的开销(每个阶段可能需要30秒)。
你可以玩一玩,看看你是否达到了一个不会产生太多开销的计划,但很可能是你运气不好,因为Hive没有按比例缩小那么好。

ne5o7dgx

ne5o7dgx2#

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

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

这将允许您避免在以前的查询中使用额外的mapjoin操作符。从技术上讲,你可以在你的最终执行计划少一个Map器。
更新
在hadoop的最新发行版中,从性能Angular 来看,无论是联合还是Map连接方法,都不会有太大的差别,因为这些操作将在以前的作业中进行优化。但请记住,在旧版本的集群上或基于某些配置属性,mapjoin可以转换为单独的作业。

相关问题