hive left outer join的问题

最近BA用户反馈有两句看似很像的语句返回的结果数不一样,比较奇怪,怀疑是不是Hive的Bug

Query 1 返回结果数6071

select count(distinct reviewid) as dis_reviewcnt
from
(select a.reviewid
from bi.dpods_dp_reviewreport  a
left outer join bi.dpods_dp_reviewlog  b
on a.reviewid=b.reviewid and  b.hp_statdate='2013-07-24'
where to_date(a.feedadddate) >= '2013-07-01'   and a.hp_statdate='2013-07-24'
) a

Query 2 返回结果数6443

select count(distinct reviewid) as dis_reviewcnt
from
(select a.reviewid
from bi.dpods_dp_reviewreport  a
left outer join bi.dpods_dp_reviewlog  b
on a.reviewid=b.reviewid and  b.hp_statdate='2013-07-24'   and a.hp_statdate='2013-07-24'
where to_date(a.feedadddate) >= '2013-07-01'
) a

第二条query比第一条多了372条数据,而且在子查询的左表中并不存在

两条语句唯一的区别是dpods_dp_reviewreport的分区过滤条件(hp_statdate是partition column)一个在where后面,另一个在on后面

粗看感觉出来的数据应该是一样的,但是玄机其实就在where和on的区别。

where 后面跟的是过滤条件,query 1 中的a.hp_statdate='2013-07-24', 在table scan之前就会Partition Pruner 过滤分区,所以只有'2013-07-24'下的数据会和dpods_dp_reviewlog进行join。

而query 2中会读入所有partition下的数据,再和dpods_dp_reviewlog join,并且根据join的关联条件只有a.hp_statdate='2013-07-24'的时候才会真正执行join,其余情况下又由于是left outer join, join不上右面会留NULL,query 2中其实是取出了所有的reviewid,所以会和query 1 结果不一样

可以做一个实验,query2去掉on后面的a.hp_statdate='2013-07-24',其余不动,执行语句,出来的distinct reviewcnt 也是 6443

select count(distinct reviewid) as dis_reviewcnt
from
(select a.reviewid
from bi.dpods_dp_reviewreport  a
left outer join bi.dpods_dp_reviewlog  b
on a.reviewid=b.reviewid and  b.hp_statdate='2013-07-24'
where to_date(a.feedadddate) >= '2013-07-01'
) a

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/extra/

query 1的query plan

ABSTRACT SYNTAX TREE:
  (TOK_QUERY (TOK_FROM (TOK_SUBQUERY (TOK_QUERY (TOK_FROM (TOK_LEFTOUTERJOIN (TOK_TABREF (TOK_TABNAME bi dpods_dp_reviewreport) a) (TOK_TABREF (TOK_TABNAME bi dpods_dp_reviewlog) b) (and (= (. (TOK_TABLE_OR_COL a) reviewid) (. (TOK_TABLE_OR_COL b) reviewid)) (= (. (TOK_TABLE_OR_COL b) hp_statdate) '2013-07-24')))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (. (TOK_TABLE_OR_COL a) reviewid))) (TOK_WHERE (and (>= (TOK_FUNCTION to_date (. (TOK_TABLE_OR_COL a) feedadddate)) '2013-07-01') (= (. (TOK_TABLE_OR_COL a) hp_statdate) '2013-07-24'))))) a)) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_FUNCTIONDI count (TOK_TABLE_OR_COL reviewid)) dis_reviewcnt))))  

STAGE DEPENDENCIES:
  Stage-5 is a root stage , consists of Stage-1
  Stage-1
  Stage-2 depends on stages: Stage-1
  Stage-0 is a root stage  

STAGE PLANS:
  Stage: Stage-5
    Conditional Operator  

  Stage: Stage-1
    Map Reduce
      Alias -> Map Operator Tree:
        a:a
          TableScan
            alias: a
            Filter Operator
              predicate:
                  expr: (to_date(feedadddate) >= '2013-07-01')
                  type: boolean
              Reduce Output Operator
                key expressions:
                      expr: reviewid
                      type: int
                sort order: +
                Map-reduce partition columns:
                      expr: reviewid
                      type: int
                tag: 0
                value expressions:
                      expr: feedadddate
                      type: string
                      expr: reviewid
                      type: int
                      expr: hp_statdate
                      type: string
        a:b
          TableScan
            alias: b
            Reduce Output Operator
              key expressions:
                    expr: reviewid
                    type: int
              sort order: +
              Map-reduce partition columns:
                    expr: reviewid
                    type: int
              tag: 1
      Reduce Operator Tree:
        Join Operator
          condition map:
               Left Outer Join0 to 1
          condition expressions:
            0 {VALUE._col5} {VALUE._col8} {VALUE._col17}
            1
          handleSkewJoin: false
          outputColumnNames: _col5, _col8, _col17
          Select Operator
            expressions:
                  expr: _col8
                  type: int
            outputColumnNames: _col0
            Select Operator
              expressions:
                    expr: _col0
                    type: int
              outputColumnNames: _col0
              Group By Operator
                aggregations:
                      expr: count(DISTINCT _col0)
                bucketGroup: false
                keys:
                      expr: _col0
                      type: int
                mode: hash
                outputColumnNames: _col0, _col1
                File Output Operator
                  compressed: true
                  GlobalTableId: 0
                  table:
                      input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                      output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat  

  Stage: Stage-2
    Map Reduce
      Alias -> Map Operator Tree:
        hdfs://10.2.6.102/tmp/hive-hadoop/hive_2013-07-26_18-10-59_408_7272696604651905662/-mr-10002
            Reduce Output Operator
              key expressions:
                    expr: _col0
                    type: int
              sort order: +
              tag: -1
              value expressions:
                    expr: _col1
                    type: bigint
      Reduce Operator Tree:
        Group By Operator
          aggregations:
                expr: count(DISTINCT KEY._col0:0._col0)
          bucketGroup: false
          mode: mergepartial
          outputColumnNames: _col0
          Select Operator
            expressions:
                  expr: _col0
                  type: bigint
            outputColumnNames: _col0
            File Output Operator
              compressed: false
              GlobalTableId: 0
              table:
                  input format: org.apache.hadoop.mapred.TextInputFormat
                  output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  

  Stage: Stage-0
    Fetch Operator
      limit: -1

Query 2的query plan

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索expr
, type
, operator
, 2013
, col
map tree
hive left outer join、hive full outer join、hive outer join、left outer join、left outer join 用法,以便于您获取更多的相关知识。

时间: 2024-09-17 02:55:34

hive left outer join的问题的相关文章

图解SQL的inner join、left join、right join、full outer join、union、union all的区别

SQL的Join语法有很多,inner join(等值连接) 只返回两个表中联结字段相等的行,left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录,right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录,看到一篇图解文章,非常清楚简洁的说明了使用JOIN操作后的结果集是什么格式. 假设我们有两张表.Table A 是左边的表.Table B 是右边的表.其各有四条记录,其中有两条记录name是相同的,如下所示: A表 id name 1 P

SQL Server的Inner Join及Outer Join

当然 Join 如何将不同的数据库的资料结合, 还要看你如何使用它, 一共有四种不同的 Join 的方式, 在这篇文章中我们将为你介绍 Inner Join 及 Outer Join 以及其应用. 在一个正规化的数据库环境中, 我们常会碰到这款情形: 所需的资料并不是放在同一个资料表中, 在这个时候, 你就要用到 Join. 当然 Join 如何将不同的数据库的资料结合, 还要看你如何使用它, 一共有四种不同的 Join 的方式, 在这篇文章中我们将为你介绍 Inner Join 及 Outer

HTAP数据库 PostgreSQL 场景与性能测试之 4 - (OLAP) 大表OUTER JOIN统计查询

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos

PostgreSQL vs Greenplum Hash outer join (hash表的选择)

标签 PostgreSQL , Greenplum , hash outer join , hash table 背景 数据分析.大表JOIN.多表JOIN时,哈希JOIN是比较好的提速手段. hash join会首先扫描其中的一张表(包括需要输出的字段),根据JOIN列生成哈希表.然后扫描另一张表. hash join介绍 https://www.postgresql.org/docs/10/static/planner-optimizer.html the right relation is

Greenplum , HAWQ outer join与motion问题讲解

Greenplum , HAWQ outer join与motion问题讲解 作者 digoal 日期 2016-09-05 标签 PostgreSQL , HAWQ , Greenplum , OUTER JOIN , Motion 背景 Greenplum,HAWQ是分布式的数据库,在建表时,我们可以选择分布列,或者选择随机分布. 多个表做等值JOIN时,如果JOIN列为分布列,则不需要进行数据的重分布. 但是,如果使用的是OUTER JOIN,情况就不一样了,你可能会发现多个表进行oute

SQL Server 2008 R2——使用FULL OUTER JOIN实现多表信息汇总

原文:SQL Server 2008 R2--使用FULL OUTER JOIN实现多表信息汇总 =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的"联系邮箱(wlsandwho@foxmail.com)"联系我 勿用于学术性引用. 勿用于商业出版.商业印刷.商业引用以及其他商业用途.       本文不定期修正完善. 本文链接:http://w

sql server Right Outer Join用法

Right Outer Join 运算符返回满足第二个(底端)输入与第一个(顶端)输入的每个匹配行的联接的每行.此外,它还返回第二个输入中在第一个输入中没有匹配行的任何行,即与 NULL 联接.如果 Argument 列内不存在任何联接谓词,则每行都是一个匹配行. 一.联接( join) 通过联接,可以根据各个表之间的逻辑关系从两个或多个表中检索数据.联接表示应如何使用一个表中的数据来选择另一个表中的行. 联接条件通过以下方法定义两个表在查询中的关联方式: 指定每个表中要用于联接的列.典型的联接

[20120223]full outer join.txt

full outer join 也就是包括左连接以及右连接,然后去除重复的记录.11g改进了算法,演示如下: SQL> select * from v$version;BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionPL/S

Native Full Outer Join

Native Full Outer Join是11g的特性,采用此特性,FULL JOIN时只需要对基表做一次扫描.而在Oracle 10g中,缺省FULL JOIN(等同于:FULL OUTER JOIN)时需要对基表做两次扫描,理论上来说性能提升了一倍.实际上,在10.2.0.3以上版本中也可以使用Native Full Outer Join,但缺省不使用此特性,除非采用以下方式: 1)使用HINT:NATIVE_FULL_OUTER_JOIN 2)将参数"_optimizer_native