首页 > 其他分享 >hive如何提高查询性能

hive如何提高查询性能

时间:2023-08-13 17:11:57浏览次数:42  
标签:join 性能 hive 查询 优化 id select

本文会通过四个方面介绍Hive性能调优,主要包括:

√性能调优工具

√设计优化策略

√数据存储优化

√作业优化技巧

1.合并中间表

一个日志文件中,每一行记录,会有很多很多字段,四五十个字段很正常。实际分析中,常常使用少数几个字段将原始的表中数据,依据业务需求提取出要分析的字段,数据放入到对应的业务表(子表)中,实际的业务针对业务表进行分析。

在实际中,我们会发现,有些业务处理,会有共同数据集用户表、订单表、商品表,三个表需要进行join的操作,join 会产生一个结果集,会有很多的业务是针对此jion结果集进行分析。

优化:将众多的业务中相同的中间结果集,抽取到一个Hive中的表中去。

2.合理使用分区表

外部表、分区表,结合使用,采用多级分区。数据采用存储格式(textfile、orcfile、parquet)或者数据压缩(snappy)。

明细数据我们一般采用按天分区,对于特别大的表,可以采用子分区,每个分区其实对应到HDFS上就是一个目录。数据存储方式我们可以采用parquet列式存储,同时具有很好的压缩性能;同时可以减少大量的表扫描和反序列化的时间。在OLAP查询场景下,我们选择需要的列信息进行查询,而不是直接select * 查询所有字段。

3.优化查询

Hive调优及优化的12种方式
Hive性能调优
如何优化查询速度
hive 查询性能优化总结
数据倾斜产生,原因及其解决方案
什么是数据倾斜?如何解决数据倾斜?
深入浅出Hive数据倾斜

通过谓词下推,压缩等技术实现极佳的速度提升???
使用sortby和使用order by 的去区别??
数据倾斜??

where条件优化
优化前(关系数据库不用考虑会自动优化):

select m.cid,u.id from order m join customer u on( m.cid =u.id )where m.dt='20180808';
优化后(where条件在map端执行而不是在reduce端执行):

select m.cid,u.id from (select * from order where dt='20180818') m join customer u on( m.cid =u.id);
union优化
尽量不要使用union (union 去掉重复的记录)而是使用 union all 然后在用group by 去重

count distinct优化
不要使用count (distinct cloumn) ,使用子查询。

select count(1) from (select id from tablename group by id) tmp;
用in 来代替join
如果需要根据一个表的字段来约束另为一个表,尽量用in来代替join 。

select id,name from tb1 a join tb2 b on(a.id = b.id);

select id,name from tb1 where id in(select id from tb2);
in 要比join 快

消灭子查询内的 group by 、 COUNT(DISTINCT),MAX,MIN。可以减少job的数量。

join 优化:
Common/shuffle/Reduce JOIN:连接发生的阶段,发生在reduce 阶段,适用于大表连接大表(默认的方式)

Map join :连接发生在map阶段,适用于小表连接大表大表的数据从文件中读取;小表的数据存放在内存中(hive中已经自动进行了优化,自动判断小表,然后进行缓存)。

set hive.auto.convert.join=true;
SMB join:Sort -Merge -Bucket Join 对大表连接大表的优化,用桶表的概念来进行优化。在一个桶内发送生笛卡尔积连接(需要是两个桶表进行join)

set hive.auto.convert.sortmerge.join=true;
set hive.optimize.bucketmapjoin = true;
set hive.optimize.bucketmapjoin.sortedmerge = true;

set hive.auto.convert.sortmerge.join.noconditionaltask=true;

关于with as 的使用

https://blog.csdn.net/qq_40640228/article/details/118083226

在关系型数据库中,对于UNION ALL,使用WITH AS定义了一个UNION ALL语句,当该片断被调用2次以上,优化器会自动将该WITH AS短语所获取的数据放入一个Temp表中
在Hive内 WITH AS语法默认并不会将执行结果作为临时表存入内存,而是每一次引用都会执行一次WITH AS内的计算逻辑,而MySQL和SqlServer这种关系型数据库执行WITH AS时会将计算结果作为临时表。

在hive中有一个参数

hive.optimize.cte.materialize.threshold

1
  这个参数在默认情况下是-1(关闭的);当开启(大于0),比如设置为2,则如果with…as语句被引用2次及以上时,会把with…as语句生成的table物化,从而做到with…as语句只执行一次,来提高效率。

将hive.optimize.cte.materialize.threshold设置为1

标签:join,性能,hive,查询,优化,id,select
From: https://www.cnblogs.com/Spring-Rain/p/17625770.html

相关文章

  • LAXCUS分布式操作系统技术创新引领高性能计算与人工智能新时代
    随着科技的飞速发展,高性能计算、并行计算、分布式计算、大数据、人工智能等技术在各个领域得到了广泛应用。在这个过程中,LAXCUS分布式操作系统以其卓越的技术创新和强大的性能表现,成为了业界的佼佼者。本文将围绕LAXCUS分布式操作系统的技术创新,探讨其在高性能计算与人工智能领域的......
  • LAXCUS分布式操作系统:技术创新引领高性能计算与人工智能新时代
    随着科技的飞速发展,高性能计算、并行计算、分布式计算、大数据、人工智能等技术在各个领域得到了广泛应用。在这个过程中,LAXCUS分布式操作系统以其卓越的技术创新和强大的性能表现,成为了业界的佼佼者。本文将围绕LAXCUS分布式操作系统的技术创新,探讨其在高性能计算与人工智能领域......
  • System.currentTimeMillis()高并发性能优化
    摘要:System.currentTimeMillis()性能问题的研究、测试与优化。  性能优化使用的测试环境:jdk版本jdk8  操作系统:macOS版本:13.2.1芯片:AppleM1CPU核数:8核  System.currentTimeMillis()是Java极其常用的API,广泛地用来获取时间戳或统计代码执行耗时等,在我们的......
  • 高性能MySQL 七-十六
    七、MySQL高级性能7.1分区表MySQL在创建表时使用PARTITIONBY子句定义每个分区存放的数据分区的一个主要目的是将数据按照一个较粗的力度分在不同的表中。这样做可以将相关的数据存放在一起1)分区表的原理SELECT查询:当查询一个分区表的时候,分区层先打开并锁住所有的底层表,......
  • ChatGPT联网查询基于yahoo搜索引擎
    联网查询原理很简单1.对搜索内容分词2.将分词后的内容用yahoo搜索3.将搜索返回的内容交给ChatGPT整理提炼Demo代码如下importfetchfrom'node-fetch';importSegmentfrom'segment';import{HttpsProxyAgent}from'https-proxy-agent';constproxyUrl='http://1......
  • 性能测试
    性能测试cProfilePython代码性能分析之cProfilePython编程时,除了要保证代码功能的正确性,还要考虑代码的执行效率。什么是cProfilecProfile(语言编写的测试模块)是一个标准库内建的性能分析工具,可以在标准输出中看到每一个函数被调用的次数和运行的时间,从而找到程序的性能瓶颈......
  • oracle归档日志暴增原因分析,Oracle归档日志满导致数据库性能异常慢 转发 https://b
    ============= oracle数据库archivelog暴增分析====================前言归档量突然增长到981G/天,导致归档目录使用率告警归档日志量异常暴增会导致磁盘空间爆满,数据库异常1、归档日志量统计SELECTTRUNC(FIRST_TIME)"TIME",SUM(BLOCK_SIZE*BLOCKS)/1024/1024/102......
  • 区间半群查询与 Ackermann 函数
    最近在思考半在线卷积的复杂度有没有可能进一步优化,决定先理清类似的问题以寻求经验.一区间合并如果询问的时候不能进行半群运算,显然我们需要在预处理阶段处理所有答案,必须进行\(O(n^2)\)次计算.二区间合并如果询问的时候可以进行一次半群运算,则可以把序列每次在中......
  • 多表联查和单表多次查询的异同
    多表联查和单表多次查询各有优点,选择哪种方式更好取决于具体的情况和数据量大小。在数据量不大的情况下,多表联查和单表多次查询的效率差别不大,因此使用多表联查可能更方便。然而,当数据量足够大时,单表多次查询的效率更高,因为这种查询方式可以让缓存的效率更高,减少冗余记录的查询,并有......
  • linux中常用端口查询命令
    1、lsof-i:80 用于查看某一端口的占用情况2、netstat-tunlp|grep80 用于查看指定的端口号的进程情况......