HIVE 中内连接(JOIN ON) 与 LEFT SEMI JOIN 分析
2017-03-15 19:31
471 查看
由于Hive中都是等值连接,在JOIN使用的时候,有两种写法在理论上是可以达到相同的效果的。
由于HIVE中都是等值连接,在JOIN使用的时候,有两种写法在理论上是可以达到相同的效果的,但是由于实际情况的不一样,子表中数据的差异导致结果也不太一样。
写法一:
select
a.bucket_id,
a.search_type,
a.level1,
a.name1,
a.level2,
a.name2,
cast((a.alipay_fee) as double) as zhuliu_alipay,
cast(0 as double) as total_alipay
from tmall_data_fdi_search_zhuliu_alipay_cocerage_bucket_1 a
left semi join
tmall_data_fdi_dim_main_auc b
on (a.level2 = b.cat_id2
and a.brand_id = b.brand_id
and b.cat_id2 > 0
and b.brand_id > 0
and b.max_price = 0
)
3121 条
写法二:
select
a.bucket_id,
a.search_type,
a.level1,
a.name1,
a.level2,
a.name2,
cast((a.alipay_fee) as double) as zhuliu_alipay,
cast(0 as double) as total_alipay
from tmall_data_fdi_search_zhuliu_alipay_cocerage_bucket_1 a
join tmall_data_fdi_dim_main_auc b
on (a.level2 = b.cat_id2
and a.brand_id = b.brand_id)
where b.cat_id2 > 0
and b.brand_id > 0
and b.max_price = 0
结果是:3142
这两种写法带来的值居然不是相等的,我一直以为理解这两种方式的写法是一样的,
但是统计的结果却是不一样的。
目前还没有搞清楚是什么原因,谁能那个搞清楚呢。
经过一层一层的查找,发现是由于子表(tmall_data_fdi_dim_main_auc)中存在重复的数据,当使用JOIN ON的时候,A,B表会关联出两条记录,应为ON上的条件符合;
而是用LEFT SEMI JOIN 当A表中的记录,在B表上产生符合条件之后就返回,不会再继续查找B表记录了,所以如果B表有重复,也不会产生重复的多条记录。
大多数情况下JOIN ON 和left semi on是对等的,但是在上述情况下会出现重复记录。大家以后可要小心。
由于HIVE中都是等值连接,在JOIN使用的时候,有两种写法在理论上是可以达到相同的效果的,但是由于实际情况的不一样,子表中数据的差异导致结果也不太一样。
写法一:
select
a.bucket_id,
a.search_type,
a.level1,
a.name1,
a.level2,
a.name2,
cast((a.alipay_fee) as double) as zhuliu_alipay,
cast(0 as double) as total_alipay
from tmall_data_fdi_search_zhuliu_alipay_cocerage_bucket_1 a
left semi join
tmall_data_fdi_dim_main_auc b
on (a.level2 = b.cat_id2
and a.brand_id = b.brand_id
and b.cat_id2 > 0
and b.brand_id > 0
and b.max_price = 0
)
3121 条
写法二:
select
a.bucket_id,
a.search_type,
a.level1,
a.name1,
a.level2,
a.name2,
cast((a.alipay_fee) as double) as zhuliu_alipay,
cast(0 as double) as total_alipay
from tmall_data_fdi_search_zhuliu_alipay_cocerage_bucket_1 a
join tmall_data_fdi_dim_main_auc b
on (a.level2 = b.cat_id2
and a.brand_id = b.brand_id)
where b.cat_id2 > 0
and b.brand_id > 0
and b.max_price = 0
结果是:3142
这两种写法带来的值居然不是相等的,我一直以为理解这两种方式的写法是一样的,
但是统计的结果却是不一样的。
目前还没有搞清楚是什么原因,谁能那个搞清楚呢。
经过一层一层的查找,发现是由于子表(tmall_data_fdi_dim_main_auc)中存在重复的数据,当使用JOIN ON的时候,A,B表会关联出两条记录,应为ON上的条件符合;
而是用LEFT SEMI JOIN 当A表中的记录,在B表上产生符合条件之后就返回,不会再继续查找B表记录了,所以如果B表有重复,也不会产生重复的多条记录。
大多数情况下JOIN ON 和left semi on是对等的,但是在上述情况下会出现重复记录。大家以后可要小心。
相关文章推荐
- HIVE 中内连接(JOIN ON)与LEFT SEMI JOIN查询结果不一致的分析
- HIVE 中内连接(JOIN ON)与LEFT SEMI JOIN查询结果不一致的分析
- HIVE 中内连接(JOIN ON) 与 LEFT SEMI JOIN 分析
- left join on左连接的使用
- 连接查询 left join on, union
- HIVE 处理非等值连接(join.... on .... like ....)
- [Hive]用left semi join替代in子查询的方式
- 内连接、外连接(左连接、右连接、全外连接)inner join on, left join on, right join on
- hive left join 条件on 和 where 的放置
- hive left outer join on注意点
- hive left semi join讲解
- Hive0.14在left outer join多级连接中,执行计划生成BUG记录
- hive中的LEFT SEMI JOIN
- left join on左外连接
- Hive的left join、left outer join和left semi join三者的区别
- Hive sql语法:inner join on, left join on, right join on详细使用方法
- 【MYSQL】left join on(左连接)
- 【转】hive中的LEFT SEMI JOIN
- Hive中的LEFT SEMI JOIN<转>
- Mysql左连接left join on与右连接 right join on,内连接union区别