hive sql分区和条件优化

分区过滤

  1. 如果不加分区,默认会扫描整个表的数据
  2. 如何查看表有哪些分区:show partitions databaseName.tableName
  3. 如何确认分区是否生效:explain dependency sql

分区放置位置

  1. 普通查询,分区过滤放在where后面,如
    select * from table1 t1 where t1.date between '20151205' and '20151206'
    • 说明:var between ‘a’ and ‘b’意思是var>=’a’ and var<=’b’
  2. inner join,分区过滤放在where后面,如
    select * from table1 t1 join table t2 on (t1.id=t2.id) where t1.date between '20151205' and '20151206' and t2.date between '20151205' and '20151206'
  3. left join,左边表的分区过滤放在where后面,右边表分区过滤放在on后面,如
    select * from table1 t1 left join table t2 on (t1.id=t2.id and t2.date between '20151205' and '20151206') where t1.date between '20151205' and '20151206'

    • 说明:right join相反

除了分区条件的放置之外其他的条件也类似,如t2.order_type=’3’放置在where后面则是在join之后进行过滤,放在on后面则是在join之前过滤

### HiveSQL SparkSQL 性能优化技巧最佳实践 #### HiveSQL 的性能优化 对于HiveSQL而言,其性能优化可以从多个方面入手: - **分区表设计**:合理利用分区可以显著减少扫描的数据量。当查询条件能够匹配上某个特定的分区时,Hive会自动跳过不相关的分区,从而提高效率[^2]。 - **桶表的应用**:通过设置合理的bucket数目来分布数据,可以使某些类型的join操作更加高效。这有助于平衡各reduce任务的工作负载并加快处理速度。 - **压缩技术的选择**:采用合适的压缩算法(如Snappy、Gzip等),不仅可以节省磁盘空间,还能加速I/O密集型作业中的读写过程。需要注意的是,在选择压缩方式时要权衡CPU消耗与传输带宽之间的关系[^1]。 - **调整MapReduce参数**:适当调节mapred.job.reduce.tasks的数量以及mapred.max.split.size大小,可改善整体执行计划;另外开启推测执行机制也有助于应对慢节点问题。 #### SparkSQL 的性能优化 针对SparkSQL,则应关注以下几个要点来进行调优: - **缓存中间结果集**:对于频繁访问的数据源或是迭代式的机器学习算法来说,持久化RDD/Dataset至内存中是非常有效的手段之一。这样做的好处是可以避免重复计算开销,进而提升响应时间。 - **广播变量应用**:当存在较小规模却会被多次使用的集合时,将其注册成broadcast variable可以让每个executor仅需获取一次副本即可共享给所有task使用,减少了网络通信的成本。 - **列式存储格式选用**:Parquet/ORC这类基于columnar storage model构建起来的文件格式非常适合OLAP场景下的大规模数据分析需求。因为它们允许只加载所需字段对应的block部分而非整行记录,大大降低了IO负担。 - **动态分区裁剪功能启用**:这项特性使得在多级关联查询过程中可以根据实际过滤条件提前排除掉不必要的partition分支,进一步缩小参与运算的数据范围。 ```sql -- 启用动态分区裁剪 SET hive.optimize.ppd=true; ``` - **自适应查询执行框架(AQE)**:这是Spark 3.x版本引入的一项重要改进措施,它能够在运行期间根据实际情况动态调整shuffle partition数目的多少,并且支持skew join优化等功能,极大地增强了系统的灵活性鲁棒性。 ```scala // 开启AQE选项 spark.conf.set("spark.sql.adaptive.enabled", "true") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值