返回顶部
首页 > 资讯 > 数据库 >HiveSQL常用(下篇:使用技巧与优化)
  • 390
分享到

HiveSQL常用(下篇:使用技巧与优化)

HiveSQL常用(下篇:使用技巧与优化) 2021-04-17 00:04:34 390人浏览 猪猪侠
摘要

结合实际工作应用,整理Hivesql常用实用相关,包括常用函数、语句,以及使用技巧与优化和其它注意项等,分为上下篇,下篇:使用技巧与优化 很高兴遇到你~ (1)Hive常用日期格式处理 (2)Hive常用函数

HiveSQL常用(下篇:使用技巧与优化)

结合实际工作应用,整理Hivesql常用实用相关,包括常用函数、语句,以及使用技巧与优化和其它注意项等,分为上下篇,下篇:使用技巧与优化

很高兴遇到你~

(1)Hive常用日期格式处理

(2)Hive常用函数

(3)Hive常用语句(实用)

  • 数据加载清理与建表
  • 表检索与表结构查询

(4)HiveSQL使用技巧与优化

(5)HiveSQL使用注意项

 

HiveSQL使用技巧与优化

SQL执行顺序:FROM->JOIN->WHERE->GROUP BY->HAVING->SELECT->ORDER BY->LIMIT

 

  • distinct去重与count
--distinct去重时,如果存在NULL,结果会异常,Hive不会将null值归为一个值处理,此时需要给NULL进行转换
select distinct nvl(column1,""),nvl(column2,0) from t;

--count(*)、count(1)对所有行进行统计,包括null行,count(column_name)只对该列中非null的进行统计

--Hive中要避免使用count(distinct),它无法进行聚合操作,只在一个reduce上完成,容易出现性能瓶颈甚至oom内存溢出,使用group by来替代
--count distinct
select col1,count(distinct id) as did
from t
group by col1;
--使用group by优化替代
select col1,count(id) as did
from(select col1,id from t group by col1,id) as temp
group by col1;

 

  • subquerys子查询&exists/in&left semi join
--subquerys子查询:hive只支持from和where后的子查询
--如果子查询中包含null值,不能使用not in(not in会报错,in不会)
--不推荐使用in/not in,可使用exists/not exists替代,支持子查询中的多值匹配
--not exists和left join可以有等价写法 --not exists select a,b from t1 where not exists(select 1 from t2 where t1.a=t2.a and t1.b=t2.b); --等价not exists的left join写法 select t1.a,t2.b from t1 left join t2 on (t1.a=t2.a and t1.b=t2.b) where t2.a is null; --left semi join 替代 in和exists,效率更高 --LEFT SEMI JOIN(左半连接)是IN/EXISTS子句查询的一种更高效的实现 --LEFT SEMI JOIN 的限制是:JOIN 子句中右边的表只能在ON 子句中设置过滤条件,在WHERE 子句、SELECT 子句或其他地方过滤都不行 --LEFT SEMI JOIN 只会显示出左边表的字段,left semi join会掉右表中重复的记录,不会因为右表重复key join出多条 --in/exists SELECT a.key, a.value FROM a WHERE a.key in (SELECT b.key FROM B);
--left semi join替代in/exists SELECT a.key, a.val FROM a LEFT SEMI JOIN b on (a.key = b.key)

 

  • sort by&distribute by&cluster by&order by
--ORDER BY 全局排序,默认了reducer个数为1,只有一个Reduce任务,效率低下,如果对大数据集进行order by排序可能会造成性能瓶颈,造成reduce的时间非常长
--如果在strict模式下使用order by语句,那么必须要在语句中加上limit关键字,因为执行order by只启动单个reduce,如果排序的结果集过大,那么执行时间会很久的原因
set hive.mapred.mode=nonstrict; (default value / 默认值)
set hive.mapred.mode=strict;
--order by会引发全局排序,数据量较小order by即可(Hive中尽量不要使用order by,除非非常确定结果集非常小)
--实际场景中一般先使用sort by再使用order by效率更高一些,使用distribute和sort进行分组排序,sort by+order by,sort by过程可以设置reducer个数(n),order by过程用n个reduce的输出文件进行一次全排序,得到最终结果
--sort by&distribute by --sort by只能保证在单个reduce内有序 select * from baidu_click distribute by product_line sort by click desc; select * from t distribute by id sort by id; --distribute指定map输出结果是如何分配的,上句中相同的id会被分配到同一个reduce上去处理,然后再通过sort by对各个reduce上的id进行排序(被distribute by设定的字段为KEY,数据会被HASH分发到不同的reducer机器上,然后sort by会对同一个reducer机器上的每组数据进行局部排序) --cluster by(distribute by + sort by替代方案) --当distribute by和sort by的字段完全一致时,等价于cluster by,但cluster by排序只能是升序排序,不能指定排序规则为ASC或者DESC --cluster by 和 distribute by 是很相似的,最大的不同是, cluster by 里含有一个分桶的方法 select * from emp cluster by deptno; select * from emp distribute by deptno sort by deptno; --常见两种高效的排序实现 --可先通过一个group by的子查询来取一个小的结果集,然后再对这个结果集进行全局排序 select * from ( select id,count(id) as cnt from t group by id) as temp order by temp.cnt; --高效实现top排序 --先取出各个结果集的top n,再取出全局的top n select a.id,salary from (select id,salary from t1 distribute by sort by salary desc limit 10) as temp order by temp.salary limit 10;

 

HiveSQL使用注意项

  1. 创建表和删除表使用if not exists/if exists防止异常;

  2. 分区字段不能出现在建表中,只能出现在partition by中;

  3. 使用具体列名避免使用select *;

  4. where 条件过滤时,!=、<>都会将null值过滤掉,导致实际结果集变小,如果需要保留null值:where (col1 <> "value" or col1 is null)

  5. group by时,select的列别名不能被group by解析,group by后不能使用别名,因为hive执行解析严格按照SQL执行顺序,先group by,后select

  6. Hive不支持UPDATE操作,只能drop再insert

  7. hive创建视图和其它数据库创建视图无异

  8. hive int与string类型,null底层默认存储为N,查询显示为null,导出文件会以存储格式导出,需要注意。若导出为null,存储的字符串就是null字符串而非null值;SQL中null代表空值, 值得警惕的是, 在HiveQL中String类型的字段若是空(empty)字符串, 即长度为0, 那么对它进行IS NULL的判断结果是False.

  9. 分号是SQL语句结束标记,在HiveQL中也是,但是在HiveSQL中,对分号的识别没有那么智慧,在DBeaver SQL IDE中也会出现因为加了;导致SQL报错的情况。另外字符";"使用需要转义,如:select concat(key,concat(";",key)); 在Hive中会报错,应使用分号的八进制的ASCII码进行转义,应写成:select concat(key,concat("73",key));

  10. hive支持嵌入mapReduce程序,来处理复杂的逻辑,但一般不使用,为了维护方便,类似桶表一般也不使用

  11. 如何查看Hive的属性设置情况,如:set hive.mapred.mode; --hive.mapred.mode=nonstrict,要注意的是strict模式也会限制分区表的查询,解决方案是必须指定分区

 

您可能感兴趣的文档:

--结束END--

本文标题: HiveSQL常用(下篇:使用技巧与优化)

本文链接: https://lsjlt.com/news/8557.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • HiveSQL常用(下篇:使用技巧与优化)
    结合实际工作应用,整理HiveSQL常用实用相关,包括常用函数、语句,以及使用技巧与优化和其它注意项等,分为上下篇,下篇:使用技巧与优化 很高兴遇到你~ (1)Hive常用日期格式处理 (2)Hive常用函数 ...
    99+
    2021-04-17
    HiveSQL常用(下篇:使用技巧与优化)
  • Golang方法的使用与优化技巧
    Golang方法的使用与优化技巧 在Go语言编程中,方法是一种特殊类型的函数,它是一个与对象关联的函数。本文将通过具体的代码示例介绍Golang方法的使用和优化技巧,让读者更好地掌握这...
    99+
    2024-02-23
    使用 优化技巧 golang方法 go语言
  • PostgreSQL常用优化技巧示例介绍
    目录1、标量子查询与filter2、视图合并3、谓词推入1、标量子查询与filter 当一个查询在select和from之间,那么这种子查询就是标量子查询。实际应用中,很多人在写SQL时为了方便会写一堆标量子查...
    99+
    2024-04-02
  • DIV CSS常用优化技巧有哪些
    本篇内容主要讲解“DIV CSS常用优化技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“DIV CSS常用优化技巧有哪些”吧! 一.使用css缩写 ...
    99+
    2024-04-02
  • 常用SQL语句优化技巧有哪些
    这篇文章将为大家详细讲解有关常用SQL语句优化技巧有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:除了建立索引之外,保持良好的SQL语句编写习惯将会降低SQ...
    99+
    2024-04-02
  • Windows 下的 Django 缓存设置与优化技巧。
    Windows 下的 Django 缓存设置与优化技巧 Django 是一个高效的 Web 开发框架,它提供了强大的缓存机制来优化网站的性能。在本文中,我们将介绍如何在 Windows 下设置 Django 缓存,以及如何优化缓存以提高网站...
    99+
    2023-10-23
    缓存 django windows
  • Centos内存的使用以及优化技巧
    本篇内容介绍了“Centos内存的使用以及优化技巧”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Linux服务器分配真实与虚拟内存给处理器,...
    99+
    2023-06-10
  • Go函数性能优化:管道与通道的使用技巧
    管道和通道是 go 中实现并行性与并发性的重要工具。它们可以通过以下几种方式优化 go 函数性能:管道:实现并行 i/o,提高吞吐量。通道:缓冲管道,管理计算密集型任务的并发执行。选择性...
    99+
    2024-05-03
    管道 通道
  • golang函数调用的优化技巧
    go 函数调用优化技巧答案:通过优化函数调用技术,可显著提高 go 程序性能。减少函数调用次数: 减少不必要的调用次数,使用位运算替代函数调用。内联函数: 将函数体嵌入调用函数,避免函数...
    99+
    2024-04-29
    函数调用优化 golang 作用域
  • win7系统常用的注册表优化技巧有哪些
    小编给大家分享一下win7系统常用的注册表优化技巧有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!打开注册表编辑器:按住键盘的“Win+R”快捷组合键 或者 点击开始菜单,选择运行,打开“运行”命令对话窗口。接着输入R...
    99+
    2023-06-27
  • MyEclipse常用的使用技巧分享
    这篇文章主要介绍“MyEclipse常用的使用技巧分享”,在日常操作中,相信很多人在MyEclipse常用的使用技巧分享问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MyEclipse常用的使用技巧分享”的疑...
    99+
    2023-06-17
  • 优化Go语言内存使用的几种技巧
    优化Go语言内存使用的几种技巧可以包括以下几个方面:1. 使用指针传递:Go语言中的函数参数传递都是值传递,如果传递大的结构体或者数...
    99+
    2023-10-08
    Golang
  • php性能优化函数有哪些使用技巧?
    对于使用PHP开发的网站或应用程序来说,性能优化是非常重要的。一个高性能的网站能够提供更好的用户体验,同时也能够减少服务器的负载。在优化PHP性能中,我们需要关注一些特定的函数和技巧。下面是一些常见的PHP性能优化函数的使用技巧。使用缓存函...
    99+
    2023-10-21
    压缩 调试 优化技巧:缓存
  • 优化 PHP 函数:使用技巧和注意事项
    通过遵循以下优化技巧和注意事项,可以显著提高 php 函数性能:保持函数简洁。避免局部变量,改用全局变量。避免使用字符串,改用常量或枚举。使用内存缓存。启用 opcache。同时,需要注...
    99+
    2024-04-11
    技巧 php 堆栈溢出
  • 使用Go语言优化函数设计的技巧
    使用Go语言优化函数设计的技巧 Go语言作为一种现代化的编程语言越来越受到开发者们的青睐。在日常开发中,我们经常会编写函数来完成各种任务。优化函数设计不仅可以提高代码的性能,还能使代码...
    99+
    2024-04-02
  • Pandas与Docker的使用技巧
    本篇内容介绍了“Pandas与Docker的使用技巧”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!pandas 读取无头 CSV我们知道,C...
    99+
    2023-06-15
  • mathtype的下载与使用技巧超详细教程
    目录首先补充一下mathtype的下载与安装给出下载网址——详细安装过程:step1:step2:step3:可能会出现word里面不在,小编遇到这种情况,就...
    99+
    2023-01-29
    mathtype下载与使用 mathtype使用
  • 22个Vue优化技巧(项目实用)
    目录代码优化 v-for 中使用 key v-if/v-else-if/v-else 中使用 key合理的选择 v-if 和 v-show 使用简单的 计算属性functional ...
    99+
    2024-04-02
  • win7实用的优化技巧有哪些
    这篇文章主要讲解了“win7实用的优化技巧有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“win7实用的优化技巧有哪些”吧!win7优化技巧一、优化窗口和界面。点击桌面空白处,选择“个性...
    99+
    2023-07-01
  • PHP应用中的性能优化技巧
    在当今的互联网时代,PHP已经成为了一个非常流行和广泛使用的编程语言。不管是Web应用还是命令行工具,PHP的使用范围都非常广泛。然而,随着应用的日益复杂和用户量的增加,PHP应用的性能问题也变得越来越重要,这就要求我们在开发过程中不断探索...
    99+
    2023-05-25
    PHP性能优化 应用优化 性能技巧
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作