hive笔记-----查询数据

一、排序和聚集

hive中的order by能够预期产生完全排序的结果,但这个排序的过程只是使用一个reduce任务来完成的,这个面对大规模的数据集肯定不可行的

因此

sort by出现,它可以为每个reduce任务产生一个排序文件

distribute by

可以控制某个特定行应该到哪个reducer,目的在于进行后续的聚集操作

例如

from record2

select year,temperture

distribute by year

sort by year asc,temperature desc;

当sort by和distribute by中所用的列相同时,可以使用cluster by简写替换

二、MapReduce脚本

transform,map,reduce子句可以在hive中调用外部脚本

add file /user/tom/book-workspace/hadoop-book/ch12/src/main/python/is_good_quality.py;

from record2

select transform(year,temperature,quality)

using ‘is_good_quality.py‘

as year,temperature;

查询本身把year,temperature和quality这些字段以制表符分隔的行的形式传递给脚本,并把制表符分隔的输出解析为year和temperature字段,最终形成查询的结果

from (

from record2

map year,temperature,quality

using ‘is_good_quality.py‘

as year,temperature) map_output

reduce year,temperature

using ‘max_temperature_reduce.py‘

as year,temperature;

在该例中map和reduce使用select transform可以实现相同的效果

三、连接

内连接

select sales.*,things.* from sales join things on (sales.id=things.id);

hive只允许在from子句中出现一个表

因此,不支持

select sales.*,things.* from sales,things where sales.id=things.id;

explain

select sales.*,things.* from sales join things on (sales.id=things.id);

可以了解hive将为这个查询使用多少个MapReduce作业

join子句中表的顺序很重要,一般最好将最大的表放到最后

外连接

左连接,返回左表中所有的项,无法匹配也返回

select sales.*,things.* from sales left outer join things on (sales.id=things.id);

右连接,返回右表中所有的项,无法匹配也返回

select sales.*,things.* from sales right outer join things on (sales.id=things.id);

全连接,返回两个表中所有的项

select sales.*,things.* from sales full outer join things on (sales.id=things.id);

半连接

hive不支持in查询

select * from things where things.id in (select id from sales);

可替换成

select * from things left semi join sales on (sales.id=things.id);

在这个过程中,右表sales只能出现在on子句中,例如不能再select表达式中引用右表

map连接

如果有一个表小到足以放入内存,hive就可以把较小的表放入每个mapper的内存来执行连接操作

如果要指定使用map连接,需要在sql中使用c语言风格的注释

select /*+ mapjoin(things) */ sales.*,things.* from sales join things on (sales.id=things.id)

执行这个查询不使用reducer,因此这个查询对right或full outer join无效,因为只有对所有输入上进行聚集操作才能检测到哪个数据无法匹配

map连接可以利用分桶的表,因为作用于桶的mapper加载右侧表中对应的通即可执行连接。此时使用的语法和前面提到的在内存中进行连接是一样的

需要启动set hive.optimize.bucketmaojoin=true;

四、子查询

hive只允许子查询出现在from子句中

select station,year,AVG(max_temperature)

from(

select station,year,MAX(temperature) as max_temperature

from record2

where temperature !=9999

and(quality=0 or quality=1 or quality=4 or quality=5 or quality=9)

group by station,year

) mt

group by station,year;

子查询中结果需要赋予别名mt,列名也需要赋予别名max_temperature

五、视图

hive中的视图是只读的,所以无法通过视图为基表加载或插入数据

create view valid_records

as

select *

from record2

where temperature !=9999

and(quality=0 or quality=1 or quality=4 or quality=5 or quality=9);

create view max_temperatures(station,year,max_temperature)

as

select station,year,MAX(temperature) from valid_records

group by station,year;

select station,year,AVG(max_temperature)

from max_temperatures

group by station,year;

可以通过视图完成第四部分中子查询相同的功能,使用的MapReduce作业的个数也相同

时间: 2024-11-06 15:43:45

hive笔记-----查询数据的相关文章

hive命令查询数据不显示表头解决办法

在hive命令行中查询数据如下: 表头未显示出来 解决办法: 修改hive安装包conf/hive-site.xml配置文件: <property> <name>hive.cli.print.header</name> <value>true</value> <description>Whether to print the names of the columns in query output.</description&g

Sql笔记-查询数据仅出现过一次、小数据位不为零、删除表及序列、ifnull函数

查询数据表中每条相同的数据仅出现一次 select  distinct(ORDER_NO ) from ibsp_record_fee 查询数据表中数据中小数位不为0 select * from ibsp_pay_record pr where  pr.amount<>round(pr.amount,0) 或者 select * from ibsp_pay_record pr where  pr.amount!= cast(pr.amount as decimal(13,0)) 删除表及id序

Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集

原文:Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集 XML 介绍 <CustomersOrders> <Customer custid="1" companyname="Customer NRZBB"> <Order orderid="10692" orderdate="2007-10-03T00:00:00&

Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 2 -使用XQuery 查询XML数据

原文:Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 2 -使用XQuery 查询XML数据 XQuery 是一个浏览/返回XML实例的标准语言. 它比老的只能简单处理节点的XPath表达式更丰富. 你可以同XPath一样使用.或是遍历所有节点,塑造XML实例的返回等. 作为一个查询语言, 你需要一个查询处理引擎. SQL Server 数据库通过XML数据类型方法的T-SQL 语句来处理XQuery. SQL Server 并不支持所有的X

初学MongoDB实践笔记——安装、创建数据库、保存及查询数据

MongoDB是一个可扩展.高性能的分布式文档存储数据库,由C 语言编写,旨在为web应用提供可扩展的高性能数据存储解决方案.它的特点是高性能.易部署.易使用,存储数据非常方便. Mongo DB 是目前在IT行业非常流行的一种非关系型数据库(NoSql),其灵活的数据存储方式备受当前IT从业人员的青睐.Mongo DB很好的实现了面向对象的思想(OO思想),在Mongo DB中每一条记录都是一个Document对象.Mongo DB最大的优势在于所有的数据持久操作都无需开发人员手动编写SQL语

mysql学习笔记——对数据记录查询操作的补充(单表内查询)

select ... from ... where ... group by ... having ... order by ... limit...; (顺序固定) 1.select 指定所要检索的字段(列) select 后加distinct关键字,则可去除重复的记录,其中,重复的记录是指 所有字段值都相同的记录 2.from 指定查询数据表,可以是表名,也可以是别名 通常是在一个表达式不易读取时,对其取别名: 表达式 as 别名; 3.where 前置过滤条件 --- 将表数据过滤掉一部分

Hive笔记整理(一)

[TOC] Hive笔记整理(一) Hive Hive由facebook贡献给Apache,是一款建立在Hadoop之上的数据仓库的基础框架. 数据仓库 特点--关于存放在数据仓库中的数据的说明: 是能够为企业的各个级别的决策提供数据支撑的数据 其实说白了,就是一个存放数据的仓库 数据库和数据仓库之间的区别 现代数据仓库,是构建在数据库之上的,使用数据库作为载体存放数据. 数据仓库着重强调的是存放的历史数据,数据库着重强调的是存放在线的数据. 数据仓库着重强调的是OLAP的操作,数据库着重强调的

Hive笔记整理(二)

[TOC] Hive笔记整理(二) Hive中表的分类 managed_table-受控表.管理表.内部表 表中的数据的生命周期/存在与否,受到了表结构的影响,当表结构被删除的,表中的数据随之一并被删除. 默认创建的表就是这种表. 可以在cli中通过desc extended tableName来查看表的详细信息,当然也可以在MySQL中hive的元数据信息表TBLS中查看. external_table-外部表 表中的数据的生命周期/存在与否,不受到了表结构的影响,当表结构被删除的,表中对应数

Hive笔记整理(三)

[TOC] Hive笔记整理(三) Hive的函数 Hive函数分类 函数的定义和java.mysql一样,有三种. UDF(User Definition Function 用户定义函数) 一路输入,一路输出 sin(30°)=1/2 UDAF(User Definition Aggregation Function 聚合函数) 多路输入,一路输出 max min count sum avg等等 UDTF(User Definition Table Function 表函数) 一路输入,多路输