我是靠谱客的博主 高贵小蜜蜂,这篇文章主要介绍【Hive】常见优化方法,现在分享给大家,希望可以做个参考。

  1. 列裁剪
    select后面跟要选择的列,由于hive中数据采用列式存储,选择需要的字段可加快字段的读取、减少数据量。(节省了读取开销,中间表存储开销和数据整合开销)
  2. 分区裁剪
    where条件第一个为分区字段,
  3. 多值group by
    如果group by后面有多个字段时,将更多值的字段放在前面,如group by有user_id和sex两个字段,应该是group by user_id、sex
  4. order by
    order by时尽量使用limit,尽量避免使用order by。Order by需要扫描数据到单个worker节点进行排序,导致单个worker需要大量内存。如果是查询Top N或者Bottom N,使用limit可减少排序计算和内存压力
  5. 大小表join
    Join时将大表放在左边:join时会将左边的表分割到多个worker,然后将join右边的表数据整个复制一份发送到每个worker进行计算。如果右边的表数据量太大,则可能会报内存溢出错误
  6. union 和 union all
    UNION ALL 代替 UNION :不用去重.和distinct的原因类似, UNION有去重的功能, 所以会引发内存使用的问题.如果只是拼接两个或者多个SQL查询的结果, 考虑用UNION ALL
  7. 谓词下推
    在子查询中,where条件应当放在子查询内部,而非外部。
  8. distinct
    使用group by代替distinct,当要计算某一列去重数据量时,使用count(distinct)时,速度很慢,原因和order by一样,数据将会在一个reduce中处理,此时可以使用group by语句替代
复制代码
1
2
3
4
eg:select count(distinct user_id) from table_name 改为 select count(1) from (select user_id from table_name group by user_id)t;

当然,使用group by时会产生两个MR job,而distinct只会产生一个job,因此当数据量大到启动job的overhead远小于计算耗时,才考虑这种方法。当数据集很小或者key的倾斜比较明显时,group by还可能会比distinct慢。

最后

以上就是高贵小蜜蜂最近收集整理的关于【Hive】常见优化方法的全部内容,更多相关【Hive】常见优化方法内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(79)

评论列表共有 0 条评论

立即
投稿
返回
顶部