| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> hive笔记 —— 解决where子句不能使用子查询的前提下,比较子查询结果(等于,大于,平均值) -> 正文阅读 |
|
[大数据]hive笔记 —— 解决where子句不能使用子查询的前提下,比较子查询结果(等于,大于,平均值) |
目录解决 where 字段 >(select 字段 from 表名)的情况拿网上的题目来举例子(想把题目出处贴出来的,发现网上各种网站都有这个题目,不确定来源是哪里)
表格创建好了,数据也加载好了,现在题目需求来了 需求:列出薪金比“SMITH”多的所有员工。 我一开始写sql语句写习惯了,下意识的就写的 where sal = (select sal from emp where)这种形式的sql语句。结果发现 hive不支持在where子句中使用子查询 所以如果想在hive中,需要用到 join on 表连接的形式来完成字段值的比较
就会发现虽然执行成功,但是结果为空,什么都不会输出 唯一匹配成功的一行,e1.sal 是等于 e2.sal 的,因此输出结果为空 这里正确的语句是
结果为 解决 where 字段 =(select 字段 from 表名)的情况原先在mysql中可以这样写
到了hive里面就歇菜了,会报 ParseException 的错误 那么应该怎么写来替换 in 的写法呢,答案是使用 left semi join
结果为
解决 where 字段 =(select avg(字段) from 表名 group by 字段)的情况我是根据这篇博客学习后,才知道还有这种解决方法 建议去源博客地址查看,我这里只是简单的写一下 现在的需求是找出所有科目成绩都大于某一学科平均成绩的学生
这里的开窗函数 avg(score) over(partition by subject_id) 用来求每个学科的成绩平均值,这里外面还套上了一层cast()函数,是要保证最后求出来的平均值是int类型。
从第一步得出的表中提取 t1.* 全部列,然后还要再加上一个新的列,列名为flag 这个列的作用是通过hive 的 if 函数来判断 if 函数 :语法: if(boolean testCondition, T valueTrue, T valueFalseOrNull) 因此当t1.score > t1.avg,也就是学生的成绩大于学科平均成绩时,返回的结果为0
最后的 sum(t2.flag)=0; 如果某个学生的每一科成绩都大于学科平均成绩,那么,按照 t2.uid分组后,一个uid对应一个学生,一个组里面有一个学生的三个flag比较结果,如果sum求和后结果为0,说明flag的值都为0,也就是每一科的成绩都大于学科平均成绩。 最后的结果为 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 7:58:24- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |