【hive】limit查询优化

本文介绍了Hive中limit查询的优化方法,通过开启hive.limit.optimize.enable参数,配合hive.limit.row.max.size和hive.limit.optimize.file进行数据源抽样,以减少全量查询。然而,这种方式可能使某些有用数据未被抽中。优化还包括配置文件的调整,如hive-site.xml和hive-default.xml,以及命令行参数和HQL中的SET关键字设定。

limit不优化会全部查询后,再返回部分

优化后:对数据源抽样返回

开启优化参数:

hive.limit.optimize.enable=true //开启对数据源进行采样的功能

hive.limit.row.max.size=100000 //设置最小采样容量。默认10万

hive.limit.optimize.file=10 //可抽样的最大文件数。默认10个

 

缺点:可能输入中有用的数据永远都不会被抽样到。

 

 

(1)配置文件

Hive 的配置文件包括:

  A. 用户自定义配置文件:$HIVE_CONF_DIR/hive-site.xml

  B. 默认配置文件:$HIVE_CONF_DIR/hive-default.xml

用户自定义配置会覆盖默认配置。

另外,Hive 也会读入 Hadoop 的配置,因为 Hive 是作为 Hadoop 的客户端启动的,Hive 的配 置会覆盖 Hadoop 的配置。

配置文件的设定对本机启动的所有 Hive 进程都有效。

<property>
    <name>hive.limit.optimize.enable</name>
    <value>true</value>
</property>

<property>
    <name>hive.limit.row.max.size</name>
    <value>100000</value>
</property>
 
<property>
 &
### Hive SQL 查询性能优化指南 #### 1. 避免全表扫描 全表扫描是导致查询性能下降的主要原因之一。可以通过为常用过滤条件字段创建索引或分区来减少扫描的数据量[^1]。例如,对于时间序列数据,可以按日期进行分区。 ```sql CREATE TABLE sales ( id BIGINT, amount DOUBLE, sale_date STRING ) PARTITIONED BY (year INT, month INT); ``` #### 2. 使用适当的JOIN类型 在Hive中,MAP JOIN可以显著提高小表与大表连接的性能。如果小表能够完全加载到内存中,则可以使用MAP JOIN[^4]。 ```sql SET hive.auto.convert.join=true; SELECT a.id, b.name FROM big_table a JOIN small_table b ON a.id = b.id; ``` #### 3. 合理设置Reducer数量 默认情况下,Hive会根据输入数据大小自动计算Reducer的数量,但这并不总是最优的选择。通过手动调整`hive.exec.reducers.bytes.per.reducer`参数,可以更好地控制Reducer的数量[^3]。 ```sql SET hive.exec.reducers.bytes.per.reducer=256000000; ``` #### 4. 处理数据倾斜问题 数据倾斜会导致某些Reducer任务执行时间过长,从而拖慢整个查询过程。可以通过增加Shuffle阶段的Bucket数或者使用Skew Join来缓解这一问题[^4]。 ```sql SET hive.optimize.skewjoin=true; ``` #### 5. 排序优化 全局排序(ORDER BY)需要将所有数据传递给单一Reducer,这可能导致性能瓶颈。相比之下,局部排序(SORT BY)可以在每个Mapper上独立完成,效率更高[^5]。 ```sql SELECT * FROM table_name SORT BY column_name LIMIT 10; ``` #### 6. 利用Tez引擎 相比于MapReduce,Tez框架能够提供更高效的DAG(有向无环图)执行模式,适用于复杂的多阶段查询。启用Tez通常能带来显著的性能提升[^3]。 ```sql SET hive.execution.engine=tez; ``` #### 7. 减少不必要的DISTINCT操作 频繁使用DISTINCT可能会引入额外的Shuffle操作,增加资源消耗。尽量合并多个DISTINCT为一个,或者改用其他方法实现相同功能[^2]。 ```sql SELECT COUNT(DISTINCT user_id) FROM user_actions; ``` #### 8. 缓存中间结果 对于多次使用的子查询结果,可以考虑将其缓存起来以避免重复计算。这尤其适用于迭代算法或机器学习训练过程中。 ```sql INSERT OVERWRITE TABLE temp_results SELECT * FROM source_data WHERE condition; ``` #### 9. 调整并行度 适当提高并发任务数可以帮助加速查询处理,但也要注意不要超出集群资源限制。 ```sql SET hive.exec.parallel=true; SET hive.exec.parallel.thread.number=16; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值