Hive查询之排序

Hive SQL 查询与排序技巧

一、查询语句注意事项

1、where子句中不能使用字段别名

2、like和rlike

1)使用LIKE运算选择类似的值

2)选择条件可以包含字符或数字:

% 代表零个或多个字符(任意个字符)

_ 代表一个字符。

3)RLIKE子句是Hive中这个功能的一个扩展,其可以通过Java的正则表达式这个更强大的语言来指定匹配条件。

4)案例实操

       (1)查找以2开头薪水的员工信息

hive (default)> select * from emp where sal LIKE '2%';

       (2)查找第二个数值为2的薪水的员工信息

hive (default)> select * from emp where sal LIKE '_2%';

       (3)查找薪水中含有2的员工信息

hive (default)> select * from emp where sal RLIKE '[2]';

3、支持满连接

满外连接:将会返回所有表中符合WHERE语句条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用NULL值替代。

hive (default)> select e.empno, e.ename, d.deptno from emp e full join dept d on e.deptno  = d.deptno;

4、连接谓词中不支持or

hive (default)> select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno  = d.deptno or e.ename=d.ename;   错误的

二、排序

1、全局排序( order by)

Order By:全局排序,一个Reducer

使用 ORDER BY 子句排序:

ASCascend: 升序(默认)

DESCdescend: 降序

ORDER BY 子句在SELECT语句的结尾

2、Sort By    每个MapReduce内部排序

Sort By:每个Reducer内部进行排序,对全局结果集来说不是排序。一般结合的是Distributed by使用

sort by 是单独在各自的reduce中进行排序,所以并不能保证全局有序,一般和distribute by 一起执行,而且distribute by 要写在sort by前面

如果mapred.reduce.tasks=1和order by效果一样,如果大于1会分成几个文件输出每个文件会按照指定的字段排序,而不保证全局有序。

举例:

1).设置reduce个数

hive (default)> set mapreduce.job.reduces=3;

2).查看设置reduce个数

hive (default)> set mapreduce.job.reduces;

3).根据部门编号降序查看员工信息

会根据empno的hash值进入不同的reduce中,每个reduce然后在排序

hive (default)> select * from emp sort by empno desc;

4).将查询结果导入到文件中(按照部门编号降序排序)

hive (default)> insert overwrite local directory '/opt/module/datas/sortby-result'    select * from emp sort by deptno desc;

3、Distribute By分区排序(Distribute By)

Distribute By:类似MR中partition(自定义分区),进行分区,结合sort by使用。

   注意,Hive要求DISTRIBUTE BY语句要写在SORT BY语句之前。

用distribute by 会对指定的字段按照hashCode值对reduce的个数取模,然后将任务分配到对应的reduce中去执行

就是在mapreduce程序中的patition分区过程,默认根据指定key.hashCode()&Integer.MAX_VALUE%numReduce 确定处理该任务的reduce

案例:

hive (default)> set mapreduce.job.reduces=3;

hive (default)> insert overwrite local directory '/opt/module/datas/distribute-result' select * from emp distribute by deptno sort by empno desc;

写入本地文件只能用overwrite,不能用into

4、Cluster By

distribute by 和 sort by 合用就相当于cluster by,但是cluster by 不能指定排序为asc或 desc 的规则,只能是desc倒序排列。

当distribute by和sorts by字段相同时,可以使用cluster by方式。

cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。

1)以下两种写法等价

hive (default)> select * from emp cluster by deptno;

hive (default)> select * from emp distribute by deptno sort by deptno;

注意:按照部门编号分区,不一定就是固定死的数值,可以是20号和30号部门分到一个分区里面去。

 

 

 

 

 

 

 

Hive查询排序一直处于查询中,可能有以下几种原因: ### 数据量过大 如果处理的数据量极大,Hive需要更多的时间来读取、处理和排序数据。当数据分布在多个节点上时,数据的传输和整合也会消耗大量时间。例如,在对一个包含数十亿条记录的表进行全局排序时,排序操作会涉及到大量的数据移动和比较,导致查询长时间处于执行状态。 ### 资源不足 - **内存不足**:Hive在执行查询时需要足够的内存来缓存数据和执行排序操作。如果集群的内存资源有限,Hive可能会频繁进行磁盘交换,从而严重影响查询性能,甚至导致查询一直处于执行中。例如,当执行一个复杂的多表连接并排序查询时,如果内存不足以容纳中间结果,就会出现这种情况。 - **CPU资源不足**:排序操作通常需要大量的CPU计算资源。如果集群的CPU核心数有限或者CPU负载过高,排序任务的执行速度会变慢,导致查询长时间无法完成。 ### 分区和分发设置不合理 - **Distribute By设置不当**:Distribute By用于对数据进行分区,结合Sort By使用。如果Distribute By的字段选择不合理,可能会导致数据在各个分区中分布不均匀,某些分区的数据量过大,从而使这些分区的排序操作成为瓶颈,影响整个查询的执行时间。例如,在对一个用户表按照用户ID进行Distribute By时,如果用户ID分布不均匀,某些分区可能会包含大量的用户数据,导致排序时间过长。 - **Reduce任务数量不合理**:对于distribute by进行测试,一定要分配多reduce进行处理,否则无法看到distribute by的效果。如果Reduce任务数量设置过少,每个Reduce任务需要处理的数据量就会过大,导致处理时间变长;如果Reduce任务数量设置过多,会增加任务调度和数据传输的开销,也可能导致查询性能下降。 ### 网络问题 Hive集群通常由多个节点组成,节点之间的数据传输依赖于网络。如果网络带宽不足或者网络不稳定,数据在节点之间的传输会受到影响,导致查询长时间处于执行中。例如,在进行多表连接和排序操作时,需要在不同节点之间传输大量的数据,如果网络出现拥塞或者丢包,就会影响查询的执行速度。 ### 锁问题 在Hive中,如果多个查询同时对同一个表进行操作,可能会出现锁竞争的情况。如果一个查询持有表的锁,其他查询就需要等待锁释放才能继续执行,这可能导致查询长时间处于等待状态。 ### 元数据问题 Hive的元数据存储了表的结构、分区信息等重要信息。如果元数据出现问题,例如元数据损坏或者元数据更新不及时,可能会导致Hive在执行查询时出现错误或者性能下降,使查询一直处于执行中。 ### 示例代码分析 以下是一个包含Distribute By和Sort By的Hive查询示例: ```sql -- 按照部门编号分区,每个分区内按照员工编号排序 SELECT * FROM emp DISTRIBUTE BY deptno SORT BY empno; ``` 在这个示例中,如果deptno字段的数据分布不均匀,某些部门的数据量过大,就可能导致这些分区的排序操作成为瓶颈,使查询长时间处于执行中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值