hive学习使用

本文介绍了Hive查询语言(HQL)的基本语法和高级特性,包括select、where、group by、having、join语句及排序功能。此外,还探讨了hive函数的应用。
[b][size=large]HQL数据查询[/size][/b]
数据查询是hive最主要的功能
[size=medium][b]查询语法[/b][/size]

[i]select..from语句[/i]

基本和mysql的操作差不多

select col1,col2 from table;
select col1 c1,col2 c2 from table;

select l.name,r.cousrse from (select id,name from student) l join (select id,course from student_info) r on l.id=r.id;

select * from student limit 100;


如果需要在select语句中根据某列的值进行相应的处理,hive支持在select语句中使用
case...when...then 
select id,enname,sex,
case
when sex='M' then '男'
when sex='M' then '男'
else '无性'
end
from student;



[i] where 语句[/i]

对查询条件进行限制,就需要使用where语句,

select * from student where age=18;


//也可使用or和and 连接过多个谓词表达式//
select * from student where age=18 and sex='F';


其他的谓词使用都和mysql的使用差不多。

### group by语句和having语句
group by 通常会和聚合函数一起使用,先按照一个列或多个列对结果进行分组再执行聚合,

select couint(*) from student group by age;
select avg(age) from student group by c_id; //这里查询的字段没有出现在group by后边就必须使用avg()这些聚合函数//
//如果想对分组结果进行条件过滤,可以使用having子句//
select c_id,avg(age) from student where sex='F' group by c_id having avg(age)>18;



[i]join语句[/i]
hive支持一般的join语句,但目前只支持等值连接。

1.inner join

默认采用的方式
select t1.id,t2.id from student t1 join student_info t2 on t1.id=t2.id;


2. left/right outer join

左右外连接
select t1.id,t2.id from student t1 left outer join student_info t2 on t1.id=t2.id;


3. full outer join

全外表连接
select t1.id,t2.id from student t1 full outer join student_info t2 on t1.id=t2.id;


4. left-semi join
```
左半连接是hive特有的语法,会返回左表的记录,前提是记录对于游标满足on中的判定条件。左半连接被用来代替标准sql中in的操作,

select t1.id from student t1 left semi join student_info t2 on t1.id=t2.id;


找出student_info中存在的表1的记录,不能像使用标准的sql一样通过in来完成

select t1.id from student t1 where t1.id in (select t2.id from student_info t2);//错误的语法//


这样可以使用内连接得到同样的结果,hive在有表中找到了匹配的记录,hive就会停止扫描。
```
5. map-side join

通过Mapreduce实现了join操作。不难发现,求笛卡尔积的操作时时在Reduce端完成的,这种连接

select t1.id t2.id from student t1 join student_info t2 on t1.id=t2.id;


6. 多表join

hive可以支持对多表进行join,如下:

select * from student t1 join student_info t2 on t1.id=t2.id join student_class t3 on t1.id=t3.id;

hive会为每一个join操作启动一个作业,第一个作业完成表1和表2的连接操作,第二个作业完成第一个作业的输出和表3的连接操作,以此类推。这个应该是在多次Mapreduce中是非常有用的。


### ORDER BY和SORTBY语句
hive中的ORDER BY和sql中的order by的语义是一样的,执行全局的排序,这就必须有一个Reduce来完成,否则无法达到全局排序的要求。

select * from student order by c_id desc,age asc;   //在排序时候还可以用desc和asc关键字指定排序方式//


hive还有一种排序方式,这种排序防护只会在Reducer中进行一个局部排序,也就是sortby

select * from student sort by c_id desc,age asc;


order by和sort by在hive中排序结构方式结构完全一样,当Reducer的个数只有一个时,两种结果完全相同,当Reducer的个数不止一个时,sort by的输出就可能会有重合,如表student中的id列为:
1,7,3,9,2,12
其中order by id 的结果为:

1
2
3
7
9
12


Reducer的数目为2时候,sort by id的结果为

1
7
12
2
3
9


其中前3行数据由第一个Reducer输出,后3行数据由第二个Reducer输出。

[i]DISTRIBUTE BY语句[/i]
hive可以通过distribute by控制map的输出在reducer中是如何划分的,也就是等同于Mapreducer中的Partitioner,通过分区可以使得数据进入同一个Reducer,我们操作一下

select col1,col2 from student distribute by col1 sort by col1,col2; //distribute by保证了col1相同的数据一定进入同一个Reducer,在Reducer中再按照col1,col2的顺序达到要求,这样就和上边只有一个reducer达到的效果是一样的//


```
[i] CLUSTER BY[/i]
这个只是在 DISTRIBUTE BY和SORT BY中的列完全相同时候可以用cluster by替代

[i]分桶和抽样[/i]
这个没有理清

[i]UNION ALL[/i]
hive中对于unonall的使用时非常常见的,主要用于多表合并的场景,union all要求各表select出的字段类型必须完全匹配。hive是不支持union all的,所有必须进行嵌套查询

select s.id,s.age
from(select si.cid,si.age from student_info si union all select si1.cid,si1.age from student_info si1) s;



[b][size=medium] hive函数[/size][/b]
hive内置函数很多,在数据查询中有时候会常常用到,可以通过以下命令查看

show functions;


标准函数
聚合函数
表生成函数
UDF自定义函数
学习 Hive 数据仓库工具是一个系统性的过程,需要从基础知识、环境搭建、SQL 查询语言、数据建模等多个方面入手。以下是详细的学习指南和入门教程建议。 ### 基础知识准备 在开始学习 Hive 之前,应具备一定的 Hadoop 生态系统基础,包括对 HDFS 和 MapReduce 的基本理解。Hive 是构建在 Hadoop 之上的数据仓库工具,主要用于大规模数据集的存储、查询与分析[^1]。此外,熟悉 SQL 语言对于快速上手 Hive 是非常有帮助的,因为 HiveQL 是一种类似于 SQL 的查询语言,旨在让熟悉 SQL 的用户能够轻松地进行大数据处理[^4]。 ### 环境搭建 为了实践 Hive 的功能,首先需要搭建一个合适的开发环境。推荐使用以下配置作为起点: - **Java**:1.8.0_171 或更高版本 - **Hadoop**:2.7.6 版本 - **Hive**:1.2.1 稳定版本(主流版本) - **MySQL**:5.7 或其他支持 JDBC 的数据库用于元数据存储[^2] 安装步骤通常包括解压 Hive 发行包、配置 `hive-site.xml` 文件以设置数据库连接信息、以及确保 Hadoop 配置文件正确无误。完成这些后,可以通过运行简单的 HiveQL 命令来验证安装是否成功。 ### 学习 HiveQL 一旦环境就绪,就可以开始学习如何编 HiveQL 查询了。这应该从最基础的数据定义语句(如 CREATE TABLE)和数据操作语句(如 LOAD DATA INTO TABLE)开始。随着技能的增长,可以逐步探索更复杂的特性,比如分区表、桶表、视图等高级主题。例如,创建一个简单的外部表并加载数据的示例代码如下: ```sql CREATE EXTERNAL TABLE IF NOT EXISTS logs ( id INT, log_message STRING, timestamp BIGINT ) LOCATION '/user/hive/logs'; ``` 接着,你可以通过下面这条命令向这个表中加载数据: ```sql LOAD DATA INPATH '/path/to/local/file' INTO TABLE logs; ``` ### 数据建模与优化 深入学习时,重点在于掌握如何有效地组织数据结构以便高效查询。这涉及到星型模式或雪花模式的设计原则,以及了解维度建模的概念。同时,也要学会利用索引、压缩技术以及其他性能调优技巧来提高查询效率。分层建模是构建高效数据仓库的关键环节之一,它可以帮助企业更好地管理和分析其海量业务数据[^5]。 ### 实战项目 最后但同样重要的是参与实际项目的开发。尝试基于真实世界场景设计解决方案,比如日志数据分析系统或者销售报告生成器。这样的练习不仅有助于巩固所学知识,还能增强解决复杂问题的能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值