问题与此类似,只是我想知道是否可以在一个查询中完成。这是我的工作,但我们都知道加入是昂贵的。有更好的办法吗?
select a.tbl1,b.tbl2 from ( select count(*) as tbl1 from tbl1 ) a join ( select count(*) as tbl2 from tbl2 ) b ON 1=1
oymdgrw71#
如果说连接是昂贵的,这通常是指在多个表中有许多记录需要相互匹配的情况。根据这个描述,你的加入并不昂贵,因为你只加入两个集,每个集有一个记录。
也许您注意到,单个计数所用的时间比用于计数和合并结果的命令要短得多。这是因为map和reduce操作有很大的开销(每个阶段可能需要30秒)。你可以玩一玩,看看你是否达到了一个不会产生太多开销的计划,但很可能是你运气不好,因为Hive没有按比例缩小那么好。
ne5o7dgx2#
如果将它们作为单独的列保留并不重要,则可以使用union all操作来处理行格式:
select 'tbl1', count(*) from tbl1 UNION ALL select 'tbl2', count(*) from tbl2;
这将允许您避免在以前的查询中使用额外的mapjoin操作符。从技术上讲,你可以在你的最终执行计划少一个Map器。更新在hadoop的最新发行版中,从性能Angular 来看,无论是联合还是Map连接方法,都不会有太大的差别,因为这些操作将在以前的作业中进行优化。但请记住,在旧版本的集群上或基于某些配置属性,mapjoin可以转换为单独的作业。
2条答案
按热度按时间oymdgrw71#
是的,连接很贵
如果说连接是昂贵的,这通常是指在多个表中有许多记录需要相互匹配的情况。
根据这个描述,你的加入并不昂贵,因为你只加入两个集,每个集有一个记录。
但是,你一定在看头顶
也许您注意到,单个计数所用的时间比用于计数和合并结果的命令要短得多。这是因为map和reduce操作有很大的开销(每个阶段可能需要30秒)。
你可以玩一玩,看看你是否达到了一个不会产生太多开销的计划,但很可能是你运气不好,因为Hive没有按比例缩小那么好。
ne5o7dgx2#
如果将它们作为单独的列保留并不重要,则可以使用union all操作来处理行格式:
这将允许您避免在以前的查询中使用额外的mapjoin操作符。从技术上讲,你可以在你的最终执行计划少一个Map器。
更新
在hadoop的最新发行版中,从性能Angular 来看,无论是联合还是Map连接方法,都不会有太大的差别,因为这些操作将在以前的作业中进行优化。但请记住,在旧版本的集群上或基于某些配置属性,mapjoin可以转换为单独的作业。