[跪求跪求] Hive Left Join操作BUG

DV2 2015-01-04 01:52:07
执行语句:
select t.cookie,
t.datetime,
t.province,
t.city,
t.ostype,
t.ip,
c.cookie,
if(c.cookie is null,1,0) as new_old_user
from log_test t
left join cookie_dw c
on (t.cookie = c.cookie)
where t.cookie='1234567==';

输出结果:

说明:
我的log_test是一个小表:记录数几十万(外部分区表),cookoe_dw表是一个大字典表几千万(内部表)。
如果我把c表中记录cookie='1234567=='先存到一个临时表然后临时表和log_test做上面join操作正常。
使用Hive版本:0.14
执行计划:
STAGE DEPENDENCIES:
Stage-4 is a root stage , consists of Stage-1
Stage-1
Stage-0 depends on stages: Stage-1

STAGE PLANS:
Stage: Stage-4
Conditional Operator

Stage: Stage-1
Map Reduce
Map Operator Tree:
TableScan
alias: t
Statistics: Num rows: 272329 Data size: 115467908 Basic stats: COMPLETE Column stats: NONE
Filter Operator
predicate: (cookie = '1234567==') (type: boolean)
Statistics: Num rows: 136164 Data size: 57733741 Basic stats: COMPLETE Column stats: NONE
Reduce Output Operator
key expressions: '1234567==' (type: string)
sort order: +
Statistics: Num rows: 136164 Data size: 57733741 Basic stats: COMPLETE Column stats: NONE
value expressions: ip (type: string), province (type: string), city (type: string), ostype (type: string)
TableScan
alias: c
Statistics: Num rows: 25907492 Data size: 1661921211 Basic stats: COMPLETE Column stats: NONE
Filter Operator
predicate: (cookie = '1234567==') (type: boolean)
Statistics: Num rows: 12953746 Data size: 830960605 Basic stats: COMPLETE Column stats: NONE
Reduce Output Operator
key expressions: cookie (type: string)
sort order: +
Map-reduce partition columns: cookie (type: string)
Statistics: Num rows: 12953746 Data size: 830960605 Basic stats: COMPLETE Column stats: NONE
Reduce Operator Tree:
Join Operator
condition map:
Left Outer Join0 to 1
condition expressions:
0 {VALUE._col1} {VALUE._col2} {VALUE._col3} {VALUE._col23}
1 {KEY.reducesinkkey0}
outputColumnNames: _col2, _col3, _col4, _col24, _col30
Statistics: Num rows: 14249120 Data size: 914056685 Basic stats: COMPLETE Column stats: NONE
Select Operator
expressions: '1234567==' (type: string), _col3 (type: string), _col4 (type: string), _col24 (type: string), _col2 (type: string), _col30 (type: string), if(_col30 is null, 1, 0) (type: int)
outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6
Statistics: Num rows: 14249120 Data size: 914056685 Basic stats: COMPLETE Column stats: NONE
File Output Operator
compressed: false
Statistics: Num rows: 14249120 Data size: 914056685 Basic stats: COMPLETE Column stats: NONE
table:
input format: org.apache.hadoop.mapred.TextInputFormat
output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

Stage: Stage-0
Fetch Operator
limit: -1
Processor Tree:
ListSink

Time taken: 0.503 seconds, Fetched: 61 row(s)
...全文
1205 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tchqiq 2015-01-06
  • 打赏
  • 举报
回复
引用 9 楼 Team77 的回复:
统一回复一下,SQL语句没有任何错误,我是在hive0.14中做的。 现在问题解决了,是由于hive join时候数据倾斜导致的bug造成的,饿死了,先蹬车回家做饭啦,一会附上详细的解决方案,谢谢各位朋友和大神的友情帮助啊。
是hive的bug吗?贴上来学习学习
DV2 2015-01-04
  • 打赏
  • 举报
回复
统一回复一下,SQL语句没有任何错误,我是在hive0.14中做的。 现在问题解决了,是由于hive join时候数据倾斜导致的bug造成的,饿死了,先蹬车回家做饭啦,一会附上详细的解决方案,谢谢各位朋友和大神的友情帮助啊。
tchqiq 2015-01-04
  • 打赏
  • 举报
回复
很奇怪你的hive版本可以写left join吗?这个在hive应该是语法错误啊 应该用left outer join 另外你改成left outer join 试试看再
fisher-jie 2015-01-04
  • 打赏
  • 举报
回复
将外部表弄成内部表试下
脚踏宝马 2015-01-04
  • 打赏
  • 举报
回复
对于你的数据我没法验证,但是有个问题你可能要注意下,在hive中,执行你的这个join查询时,on条件先执行,执行完这部分之后,在reduce端再执行where条件,这时候可能导致部分数据结果出现异常!你再确认下!
DV2 2015-01-04
  • 打赏
  • 举报
回复
引用 4 楼 Team77 的回复:
[quote=引用 3 楼 sky_walker85 的回复:] [quote=引用 2 楼 Team77 的回复:] [quote=引用 1 楼 sky_walker85 的回复:] 左外连接的结果就是你说的异常结果,如果按照你说的把c表中的特定记录放到临时表中了,然后再执行,肯定是你所谓的正常情况。楼主想查询怎样的结果?
我想要图片中“正常输出”的结果(我现在是“异常输出”)[/quote]
select t.cookie,
       t.datetime,
       t.province,
       t.city,
       t.ostype,
       t.ip,
       t.cookie,
       if(c.cookie is null,1,0) as new_old_user
  from log_test t
  left join cookie_dw  c
    on (t.cookie = c.cookie)
  where t.cookie='1234567==';
这样就可以了,但是感觉没必要。你的查询结果就是所谓的异常结果,left join也只能查询到这样的结果。非要所谓的正确结果的话将c.cookie替换为t.cookie即可[/quote] 不对啊,是不是我表述不清楚,可以加我QQ详说下吗?[/quote] 1252492309
DV2 2015-01-04
  • 打赏
  • 举报
回复
引用 3 楼 sky_walker85 的回复:
[quote=引用 2 楼 Team77 的回复:] [quote=引用 1 楼 sky_walker85 的回复:] 左外连接的结果就是你说的异常结果,如果按照你说的把c表中的特定记录放到临时表中了,然后再执行,肯定是你所谓的正常情况。楼主想查询怎样的结果?
我想要图片中“正常输出”的结果(我现在是“异常输出”)[/quote]
select t.cookie,
       t.datetime,
       t.province,
       t.city,
       t.ostype,
       t.ip,
       t.cookie,
       if(c.cookie is null,1,0) as new_old_user
  from log_test t
  left join cookie_dw  c
    on (t.cookie = c.cookie)
  where t.cookie='1234567==';
这样就可以了,但是感觉没必要。你的查询结果就是所谓的异常结果,left join也只能查询到这样的结果。非要所谓的正确结果的话将c.cookie替换为t.cookie即可[/quote] 不对啊,是不是我表述不清楚,可以加我QQ详说下吗?
skyWalker_ONLY 2015-01-04
  • 打赏
  • 举报
回复
引用 2 楼 Team77 的回复:
[quote=引用 1 楼 sky_walker85 的回复:] 左外连接的结果就是你说的异常结果,如果按照你说的把c表中的特定记录放到临时表中了,然后再执行,肯定是你所谓的正常情况。楼主想查询怎样的结果?
我想要图片中“正常输出”的结果(我现在是“异常输出”)[/quote]
select t.cookie,
       t.datetime,
       t.province,
       t.city,
       t.ostype,
       t.ip,
       t.cookie,
       if(c.cookie is null,1,0) as new_old_user
  from log_test t
  left join cookie_dw  c
    on (t.cookie = c.cookie)
  where t.cookie='1234567==';
这样就可以了,但是感觉没必要。你的查询结果就是所谓的异常结果,left join也只能查询到这样的结果。非要所谓的正确结果的话将c.cookie替换为t.cookie即可
DV2 2015-01-04
  • 打赏
  • 举报
回复
引用 1 楼 sky_walker85 的回复:
左外连接的结果就是你说的异常结果,如果按照你说的把c表中的特定记录放到临时表中了,然后再执行,肯定是你所谓的正常情况。楼主想查询怎样的结果?
我想要图片中“正常输出”的结果(我现在是“异常输出”)
skyWalker_ONLY 2015-01-04
  • 打赏
  • 举报
回复
左外连接的结果就是你说的异常结果,如果按照你说的把c表中的特定记录放到临时表中了,然后再执行,肯定是你所谓的正常情况。楼主想查询怎样的结果?

20,808

社区成员

发帖
与我相关
我的任务
社区描述
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
社区管理员
  • 分布式计算/Hadoop社区
  • 涤生大数据
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧