where top1000(X)<=10等条件谓词提前问题记录
来源:互联网 发布:nginx fastcgi temp 编辑:程序博客网 时间:2024/03/29 09:56
今天,遇到这样一个问题,在下面sql中:
在0.9和0.14的hive中查询结果不一样,究其根本,是0.9hive没有谓词提前功能(ppd),而0.14有这个功能。
问题就出现在这里,请看执行计划:
可以看到,一共两个运算阶段,stage-1,stage-2
stage-1:
来看看这个阶段做了什么:
看到红框里的内容了吗?编译器在这里做了一个愚蠢的事情(其实也不能怪编译器),在错误的时间错误的地点做了错误的事。
——在这个时候提前把数据过滤了,为什么说是提前呢,是因为原语句的意图是在所有记录根据only_id和pv全排序后再取top1000,而不是在t1表
这个中间结果这里,而就是这样的动作导致了后续的一些错误:
看下这个图:
这个是stage-1的执行日志,可以看到reduce有两个。因为在这个阶段过早的top1000了(top1000(only_id)<=10),每个reduce取了10条记录。
好,stage-1先说到这里,我们来看看stage-2:
其实,stage-2就只有一个reduce阶段:
可以看到,本来在这个阶段应该做top1000(only_id)<=10操作的,但是在谓词条件这一块是空的!因为这个条件已经被提前了!
好的,已经比较清晰了,为什么top1000(only_id)<=10明明限定了10条,结果会出20条——因为stage-1有2个reduce.
为什么会这样?
因为对于编译器来说,top1000(only_id)<=10只是一个谓词条件,跟a=1,b="abc"是没有差异的,编译器会毫不犹豫的把这个条件下推到语句的最内层(t1)。
所以,这不是bug,编译器无法感知谓词条件或者说是udf函数是什么意图,只会简单的把他下推到底。
所以该怎么做?
可以:set hive.optimize.ppd=false;
0 0
- where top1000(X)<=10等条件谓词提前问题记录
- SAP 金额等负号提前问题
- Where X=TypeScript
- null字段作为where条件 的问题
- hive left outer join where 条件问题
- where条件
- mongodb_查询操作使用_条件查询、where子句等
- mongodb 查询操作,条件查询,where,find等常用操作
- SQL join 和 where 等多条件连用
- Sql语句查询当天本周本月记录的where条件
- 使用where子句查询表中满足条件的记录
- 实习第7天--actionbar提前加载等相关问题
- SQL之解决where 1=1 问题及优化多条件查询
- top1000 web
- MySQL恢复之update忘加where条件误操作后数据恢复(提前条件binlog为row行格式)
- 基于谓词筛选值序列Enumerable.Where()
- cocos2d-x问题记录
- SQL条件中“is null”谓词导致全表扫描问题优化
- VGA显示--ROM部分
- 安卓下怎么获取手机中不同标签下的号码
- 简单明了一张图,帮你选择开源协议
- Android 开发 之 JNI入门 - NDK从入门到精通
- Android ,在争议中逃离 Linux 内核的 GPL 约束
- where top1000(X)<=10等条件谓词提前问题记录
- 认识User-Agent
- css中鼠标形状总结
- 解决X64操作系统PL/SQL连接报错问题 make sure you have the 32 bits oracle client installed 分类: PlSql 2012-05-20 1
- 隐马尔可夫(HMM)举例讲解
- KMP字符串模式匹配详解
- java中深拷贝和浅拷贝
- android四大组件详解
- CLion集成环境配置实用