Hive总结(十二)Hive查询进阶

通过Hive提供的order by子句可以让最终的输出结果整体有序。但是因为Hive是基于Hadoop之上的,要生成这种整体有序的结果,就必须强迫Hadoop只利用一个Reduce来完成处理。这种方式的副作用就是回降低效率。

如果你不需要最终结果整体有序,你就可以使用sort by子句来进行排序。这种排序操作只保证每个Reduce的输出是有序的。如果你希望某些特定行被同一个Reduce处理,则你可以使用distribute子句来完成。比如:

表student(classNo,stuNo,score)数据如下:

C01  N0101      82

C01  N0102      59

C02  N0201      81

C01  N0103      65

C03  N0302      92

C02  N0202      82

C02  N0203      79

C03  N0301      56

C03  N0306      72

我们希望按照成绩由低到高输出每个班级的成绩信息。执行以下语句:

Select classNo,stuNo,score from student distribute byclassNo sort by score;

输出结果为:

C02  N0203      79

C02  N0201      81

C02  N0202      82

C03  N0301      56

C03  N0306      72

C03  N0302      92

C01  N0102      59

C01  N0103      65

C01  N0101      82

我们可以看到每一个班级里所有的学生成绩是有序的。因为同一个classNo的记录会被分发到一个单独的reduce处理,而同时sort by保证了每一个reduce的输出是有序的。

注意:

为了测试上例中的distribute by的效果,你应该首先设置足够多的reduce。比如上例中有3个不同的classNo,则我们需要设置reduce个数至少为3或更多。如果设置的reduce个数少于3,将会导致多个不同的classNo被分发到同一个reduce,从而不能产生你所期望的输出。设置命令如下:

set mapred.reduce.tasks = 3;

MapReduce脚本

如果我们需要在查询语句中调用外部脚本,比如Python,则我们可以使用transform,map,reduce等子句。

比如,我们希望过滤掉所有不及格的学生记录,只输出及格学生的成绩信息。

新建一个Python脚本文件score_pass.py,内容如下:

#! /usr/bin/env python

import sys

for line in sys.stdin:

         (classNo,stuNo,score)= line.strip().split(‘\t‘)  

         ifint(score) >= 60:

                   print"%s\t%s\t%s" %(classNo,stuNo,score)

执行以下语句

add file /home/user/score_pass.py;

select transform(classNo,stuNo,score) using‘score_pass.py‘ as classNo,stuNo,score from student;

输出结果为:

C01  N0101      82

C02  N0201      81

C01  N0103      65

C03  N0302      92

C02  N0202      82

C02  N0203      79

C03  N0306      72

注意:

1) 以上Python脚本中,分隔符只能是制表符(\t)。同样输出的分隔符也必须为制表符。这个是有hive自身决定的,不能更改,不要尝试使用其他分隔符,否则会报错。同时需要调用strip函数,以去除掉行尾的换行符。(或者直接使用不带参数的line.split()代替。

2) 使用脚本前,先使用add file语句注册脚本文件,以便hive将其分发到Hadoop集群。

3) Transfom传递数据到Python脚本,as语句指定输出的列。

连接(join)

直接编程使用Hadoop的MapReduce是一件比较费时的事情。Hive则大大简化了这个操作。

内连接(inner join)

和SQL的内连相似。执行以下语句查询每个学生的编号和教师名:

Select a.stuNo,b.teacherName from student a join teacherb on a.classNo = b.classNo;

输出结果如下:

N0203      Sun

N0202      Sun

N0201      Sun

N0306      Wang

N0301      Wang

N0302      Wang

N0103      Zhang

N0102      Zhang

N0101      Zhang

注意:

数据文件内容请参照上一篇文章。

不要使用select xx from aa bb where aa.f=bb.f这样的语法,hive不支持这种写法。

如果需要查看hive的执行计划,你可以在语句前加上explain,比如:

explain Select a.stuNo,b.teacherName from student a jointeacher b on a.classNo = b.classNo;

外连接(outer join)

和传统SQL类似,Hive提供了left outer join,right outer join,full out join。

半连接(semi join)

Hive不提供in子查询。此时你可以用leftsemi join实现同样的功能。

执行以下语句:

Select * from teacher left semi join student onstudent.classNo = teacher.classNo;

输出结果如下:

C02  Sun

C03  Wang

C01  Zhang

可以看出,C04 Dong没有出现在查询结果中,因为C04在表student中不存在。

注意:

右表(student)中的字段只能出现在on子句中,不能出现在其他地方,比如不能出现在select子句中。

Map连接(map join)

当一个表非常小,足以直接装载到内存中去时,可以使用map连接以提高效率,比如:

Select /*+mapjoin(teacher) */ a.stuNo,b.teacherNamefrom student a join teacher b on a.classNo = b.classNo;

以上红色标记部分采用了C的注释风格。

当连接时用到不等值判断时,也比较适合Map连接。具体原因需要深入了解Hive和MapReduce的工作原理。

子查询(sub query)

运行以下语句将返回所有班级平均分的最高记录。

Select max(avgScore) as maScore

from

(Select classNo,avg(score) as avgScore from student group byclassNo) a;

输出结果:

80.66666666666667

以上语句中红色部分为一个子查询,且别名为a。返回的子查询结果和一个表类似,可以被继续查询。

视图(view)

和传统数据库中的视图类似,Hive的视图只是一个定义,视图数据并不会存储到文件系统中。同样,视图是只读的。

运行以下两个命令:

Create view avg_score as

Select classNo,avg(score) as avgScore from student groupby classNo;

Select max(avgScore) as maScore

From avg_score;

可以看到输出结果和上例中的结果是一样的。

原文地址:https://www.cnblogs.com/michaelwang2018/p/9990475.html

时间: 2024-11-07 11:17:33

Hive总结(十二)Hive查询进阶的相关文章

Hibernate(十二)Criteria查询

一.简述 Criteria是一种比hql更面向对象的查询方式.Criteria 可使用 Criterion 和 Projection 设置查询条件.可以设置 FetchMode(联合查询抓取的模式 ) ,设置排序方式,Criteria 还可以设置 FlushModel (冲刷 Session 的方式)和 LockMode (数据库锁模式). Criteria本身只是查询的容器.Criteria查询又称对象查询 Criteria查询采用面向对象的方式封装查询条件.由Hibernater自动生成SQ

《Linux命令行与shell脚本编程大全》第二十二章 gawk进阶

gawk是一门功能丰富的编程语言,你可以通过它所提供的各种特性来编写好几程序处理数据. 22.1 使用变量 gawk编程语言支持两种不同类型的变量: 内建变量和自定义变量 22.1.1 内建变量 gawk程序使用内建变量来引用程序数据里的一些特殊功能 1.字段和记录分隔符变量 数据字段变量:允许你使用美元符和字段在该记录中的位置值来引用记录对应的字段. 要引用第一个字段就用变量$1,第二个就用$2,-.以此类推. 数据字段是由分隔符来划定的.默认字段分隔符是一个空白字符,也就是空格或者制表符.

性能测试十二:jmeter进阶之java请求参数化

如项目中的ip.端口号之类的,都可以在此代码中定义 public Arguments getDefaultParameters() { // TODO Auto-generated method stub return null; } 此处注册两个参数到jmeter的变量池: p_name,默认值设为abc p_desc,默认值设为123 /** * 此函数里面可以人工注册一些参数,这些参数可以在java请求面板里展示或更改 */ @Override public Arguments getDe

苹果新的编程语言 Swift 语言进阶(十二)--选项链

选项链是使用选项来查询和调用其属性.方法或下标的一个过程,如果选项包含一个值,则属性.方法.下标的查询和调用成功,否则,调用返回nil. 选项链能用在任何类型的选项来检查对其一个属性.方法.下标的查询和调用是否成功. 选项链可以作为强制展开的替代方式使用,但选项链的使用更加安全,不会触发一个运行时错误. 在调用一个选项的属性.方法或下标方法时,通过在该选项值的后面放置一个(?)标记来规定一个选项链.这与在选项值后放置一个(!) 来强制展开选项的值非常相似.主要的不同是在选项值为nil时选项链能够

Hive初步使用、安装MySQL 、Hive配置MetaStore、配置Hive日志《二》

一.Hive的简单使用 基本的命令和MySQL的命令差不多 首先在 /opt/datas 下创建数据  students.txt 1001 zhangsan 1002 lisi 1003 wangwu 显示有多少数据库: show databases; 使用某个数据库: use 数据库名称; 显示当前数据库下的表: show tables; 创建数据表 : create table student (id int,name string) ROW FORMAT DELIMITED FIELDS

Python开发【第二十二篇】:Web框架之Django【进阶】

Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 新随笔 联系 订阅 管理 随笔-124  文章-127  评论-205 Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻

12. 蛤蟆的数据结构进阶十二排序实现之直接插入法

12. 蛤蟆的数据结构进阶十二排序实现之直接插入法 本篇名言:"路是脚踏出来的 ,历史是人写出来的,人的每一步行动都在书定自己的历史. --吉鸿昌" 接下来看下直接插入法的实现. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47687631 1.  直接插入法 直接插入排序(straightinsertion sort) 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序. 第一趟比较前两

2、蛤蟆的数据结构进阶二静态查询之顺序查询

2.蛤蟆的数据结构进阶二静态查询之顺序查询 本篇名言:"我从不把安逸和快乐看作是生活的本身 --这种伦理基础,我叫它猪栏的理想. --爱因斯坦" 这篇我们来看下静态查询中的顺序表查询. 我们先来看下概念,然后是代码实现. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47175103 1.  查找 在计算机科学中定义为:在一些(有序的/无序的)数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程叫做查找.

(十二)分组查询

(十二)分组查询 将数据表中的数据按某种条件分成组,按组显示统计信息 查询各班学生的最大年龄.最小年龄.平均年龄和人数 分组 SELECT <字段名表1> FROM <表名> -- 这里字段名表1 应该 是 按照字段名表2 分组以后 能够产生唯一值的 字段(如:班级) [WHERE <条件> ] GROUP BY <字段名表2> [HAVING <条件> ] [ORDER BY <字段名列表3> ] --例1 查询各班学生的最大年龄.