欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hive的数据查询

程序员文章站 2022-07-11 08:26:13
...

与mysql和oracle中的sql语句不一样地方会特别标注
Hive简单查询

#声明如下:
SELECT [ALL|DISTINCT] select_expr,select_expr,...
FROM table_reference
[WHERE where_conditon]
[GROUP BY col_list]
[CLUSTER BY col_list
    |[DISTRIBUTE BY col_list][SORT BY col_list]
    |[ORDER BY col_list]]
[LIMIT number]
DISTRIBUTE BY指定分发器(Partitioner),多Reducer可用

简单查询举例:
–表达式

查询员工信息:员工号 姓名 月薪 年薪
select empno,ename,sal,sal*12 from emp;

–null,将空值转换成0:用nvl(comm,0)

查询员工信息:员工号 姓名 月薪 年薪 奖金 年收入  
注:comm 有null的空值
select empno,ename,sal,sal*12,comm,sal*12+nvl(comm,0) from emp;

–查询Null空值:is null

查询奖金为空的员工
select * from emp where comm=null; #报错
select * from emp where comm is null;

–使用distinct来去重

select distinct depno from emp;
select distinct depno,job from emp; #distinct作用于后面所有的列,即(depno,job)

注明:上面的查询除了select * from emp;此语句不用mapreduce来分配任务,因为它只要查全表,而其它的例如表达式,排序等都要经过mapreduce来分配任务,来进行计算,排序等。

使用fetch简单查询
使用fetch直接在表中使用简单查询语句,不用经过Mapreduce,没有函数没有排序就为简单的查询语句.
使用三种方法设置fetch task功能

方法1:
在hive的提示符下输入下面的语句
hive> set hive.fetch.task.conversion=more;
方法2:
quit退出hive,在启动hive之前执行hive --hiveconf ......表示是在后面启动hive之后都可以用fetch做简单查询。这里的--hiveconf是指设置hiveconf配置。语句如下:
MacdeiMac:bin mac$ hive --hiveconf hive.fetch.task.conversion=more
方法3:
在hive的安装目录的conf下面配置修改hive-site.xml文件。
在configration中加入下面的配置
<property>
    <name>hive.fetch.task.converstion</name>
    <value>more</value>
</property>
重新启动hive,即已经生效

方法1和方法2只适用于当前的Hive,若退出后,则失效。方法3是配置永久的fetch task。

Hive过滤查询
–字符串查询

--查询名叫KING的员工
select * from emp where ename='KING';

–大小写不通用,严格区别字符串的大小写

select * from emp where ename='King';

–like模糊查询

查询名字以S打头的员工
select empno,ename sal from emp where ename like '%S'

–包含下划线查询
用转义字符\,第一个\表示的是转义字符的含义,第二个\表示的这个转义字符是什么

查询中间含有‘_’的员工
select empno,ename sal from emp where ename like '%_%';  
#它把所有数据都查出来了,因为_代表的是任意一个字符
select empno,ename sal from emp where ename like '%\\_%';

Hive 排序查询
排序是高级操作,故一定会用mapreduce作业来完成
–升降序排序

查询员工信息:员工号 姓名 月薪 按照月薪排序
select empno,ename,sal from emp order by sal; #升序
select empno,ename,sal from emp order by sal desc; #降序

–order by 后面跟:列,表达式,别名,序号

#表达式
select empno,ename,sal,sal*2 from emp order by sal*12; 
#别名
select empno,ename,sal,sal*2 annsal from emp order by annsal; 
#序号
select empno,ename,sal,sal*2 annsal from emp order by 4; 
注:empno为第一列,序号为1,故类推序号为4的是 annsal 第4列
hive中要设置参数,将序号排序设置改为true才可以用。
下面参数默认值是false,在orderby查询语句中是不能使用序号查询的
hive> set hive.groupby.orderby.position.alias=true;

–空值查询
null排序:升序默认是排在最前面
用降序排在最后面

按照奖金排序
select empno,ename,sal,comm from emp;