Hive

首先,我们来介绍一下什么是Hive。有些人不仅会想,Hive不就是写SQL的吗。没错,Hive和SQL的语法结构很像,其实,二者没有多大区别,甚至可以这样讲,Hive就是写SQL。但是,问题就来了–它真正的就是SQL了吗?它和SQL数据库有什么区别?和其他的关传统的系型数据库又有什么区别和关系呢?一系类问题,别急,我们慢慢来分析。

1、Hive 由 Facebook 实现并开源
2、是基于 Hadoop 的一个数据仓库工具
3、可以将结构化的数据映射为一张数据库表
4、并提供 HQL(Hive SQL)查询功能
5、底层数据是存储在 HDFS 上
6、Hive的本质是将 SQL 语句转换为 MapReduce 任务运行
7、使不熟悉 MapReduce 的用户很方便地利用 HQL 处理和计算 HDFS 上的结构化的数据,适用于离线的批量数据计算。

数据仓库之父比尔·恩门(Bill Inmon)在 1991 年出版的“Building the Data Warehouse”(《建 立数据仓库》)一书中所提出的定义被广泛接受——数据仓库(Data Warehouse)是一个面 向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史 变化(Time Variant)的数据集合,用于支持管理决策(Decision Making Support)。

Hive 依赖于 HDFS 存储数据,Hive 将 HQL 转换成 MapReduce 执行,所以说 Hive 是基于 Hadoop 的一个数据仓库工具,实质就是一款基于 HDFS 的 MapReduce 计算框架,对存储在 HDFS 中的数据进行分析和管理。

Hive的产生背景
大数据时代的到来,海量的数据对于传统的关系型数据库来说维护起来成本非常高,那该如何是好呢?这时候Hive就诞生了,最开始是facebook开源,最初用于解决海量结构化的日志数据统计问题;ETL (Extraction-Transformation-Loading )工具构建在Hadoop之上的数据仓库;数据计算使用MR ,数据存储使用HDFS。

Hive 定义了一种类 SQL 查询语言,叫做HQL;类似SQL,但不完全相同,通常用于进行离线数据处理(采用MapReduce);可认为是一个HQL MR的语言翻译器。

Apache Hive数据仓库软件可以使用SQL方便地阅读、编写和管理分布在分布式存储中的大型数据集。结构可以投射到已经存储的数据上。提供了一个命令行工具和JDBC驱动程序来将用户连接到Hive。产生背景有以下几个方面:

  1. MapReduce编程的不便性
  2. HDFS上的文件缺少某些字段

Hive 在Hadoop生态系统的位置

Hive体系架构


说了这么多,你对Hive的了解是不是高多了,那么问题来了,我们为什么要使用Hive呢?它有什么独特之处吗?使用 MapReduce不好吗?那么第一,我们来讲讲直接使用 MapReduce所面临的问题:

  • 人员学习成本太高;
  • 项目周期要求太短;
  • MapReduce实现复杂查询逻辑开发难度太大;

而使用Hive的方面:

  • 它有更友好的接口,操作接口采用类 SQL 的语法,提供快速开发的能力。
  • 学习成本的成本更低,避免了写 MapReduce,减少开发人员的学习成本。
  • 有更好的扩展性,可自由扩展集群规模而无需重启服务,还支持用户自定义函数。

我们再来说说Hive的优缺点:

优点
  • 可扩展性,横向扩展,Hive 可以自由的扩展集群的规模,一般情况下不需要重启服务。横向扩展:通过分担压力的方式扩展集群的规模;纵向扩展:一台服务器cpu i7-6700k 4核心8线程,8核心16线程,内存64G => 128G
  • 延展性,Hive 支持自定义函数,用户可以根据自己的需求来实现自己的函数
  • 良好的容错性,可以保障即使有节点出现问题,SQL 语句仍可完成执行

缺点

  • Hive 不支持记录级别的增删改操作,但是用户可以通过查询生成新表或者将查询结 果导入到文件中(当前选择的 hive-2.3.2 的版本支持记录级别的插入操作)。
  • Hive 的查询延时很严重,因为 MapReduce Job 的启动过程消耗很长时间,所以不能 用在交互查询系统中。
  • Hive 不支持事务(因为不没有增删改,所以主要用来做 OLAP(联机分析处理),而 不是 OLTP(联机事务处理),这就是数据处理的两大级别)。

总结:

Hive 具有 SQL 数据库的外表,但应用场景完全不同,Hive 只适合用来做海量离线数 据统计分析,也就是数据仓库。

Hive使用起来也非常容易,一起来看看它有哪些函数吧。

关系函数

  • 等值比较: =

    • 语法:A=B。如果表达式A与表达式B相等,则为TRUE;否则为FALSE
  • 不等值比较: <>

    • 语法:A <> B。如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A与表达式B不相等,则为TRUE;否则为FALSE
  • 小于比较:<

    • 语法: A < B。 如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A小于表达式B,则为TRUE;否则为FALSE
  • 小于等于比较: <=

    • 语法: A <= B。如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A小于或者等于表达式B,则为TRUE;否则为FALSE
  • 大于等于比较: >=

    • 语法:A >= B。如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A大于或者等于表达式B,则为TRUE;否则为FALSE
  • 空值判断:IS NULL

    • 语法:A IS NULL。如果表达式A的值为NULL,则为TRUE;否则为FALSE
  • 非空判断: IS NOT NULL

    • 语法: A IS NOT NULL。 如果表达式A的值为NULL,则为FALSE;否则为TRUE
  • LIKE比较: LIKE

    • 语法:A[NOT] LIKE B。如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合表达式B的正则语法,则为TRUE;否则为FALSE。B中字符”_”表示任意单个字符,而字符”%”表示任意数量的字符。
      举例: select * from dw.topic_order where partition_pay_date = ‘2016-04-22’ and client_type like ‘ip%’ ##能够匹配以ip开头的所有字符串。
      注意:对特殊字符进行转译时,注意要使用两个反斜杠\
  • JAVA的LIKE/REGEXP操作:RLIKE/REGEXP

    • 语法: A RLIKE/REGEXP B。如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合JAVA正则表达式B的正则语法,则为TRUE;否则为FALSE
      举例:select * from dw.topic_order where partition_pay_date = ‘2016-04-22’ and client_type rlike/regexp ‘^android.*’
      注意:通配符‘%’在rlike/regexp函数中,只能匹配一个’%'字符,’‘也只能匹配一个’‘字符

日期函数

  • UNIX时间戳转日期函数:from_unixtime

    • 语法: from_unixtime(bigint unixtime[, string format])。转化UNIX时间戳(从1970-01-01 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式
      举例:select from_unixtime(1323308943,‘yyyyMMdd’) from dual; ##返回值为20111208
  • 日期转年函数: year
    • 语法: year(string date)。 返回日期中的年。
  • 日期转月函数:month
    • 语法:month (string date)。返回日期中的月份。
  • 日期转天函数: day
    • 语法:day (string date)。返回日期中的天。
  • 日期转小时函数: hour
    • 语法:hour (string date)。 返回日期中的小时。
  • 日期转分钟函数: minute
    • 语法:minute (string date)。返回日期中的分钟。
      举例:select minute(‘2011-12-08 10:03:01’) from dual; ##返回值为3
  • 日期转秒函数: second
    • 语法:second (string date)。 返回日期中的秒。
      举例:select second(‘2011-12-08 10:03:01’) from dual; ##返回值为1
  • 日期转周函数: weekofyear
    • 语法:weekofyear (string date)。返回日期在当前的周数。
      举例:select weekofyear(‘2011-12-08 10:03:01’) from dual; ##返回值为49
  • 日期比较函数:datediff
    • 语法:datediff(string enddate, string startdate)。返回结束日期减去开始日期的天数。
      举例:select datediff(‘2012-12-08’,‘2012-05-09’) from dual; ##返回值为213
  • 日期增加函数:date_add
    • 语法:date_add(string startdate, int days)。 返回开始日期startdate增加days天后的日期。
      举例:select date_add(‘2012-12-08’,10) from dual; ##返回值为2012-12-18
  • 日期减少函数:date_sub
    • 语法:date_sub (string startdate, int days)。 返回开始日期startdate减少days天后的日期。
      举例:select date_sub(‘2012-12-08’,10) from dual; ##返回值为2012-11-28

条件函数

  • If函数:if

    • 语法:if(boolean testCondition, T valueTrue, T valueFalseOrNull)
      说明:当条件testCondition为TRUE时,返回valueTrue;否则返回valueFalseOrNull。
      举例:select if(app_name = ‘group’,object_id,null) as deal_id from dw.topic_order where partition_pay_date = ‘2016-04-22’
  • 非空查找函数:COALESCE
    • 语法:COALESCE(T v1, T v2, …)
      说明:返回参数中的第一个非空值;如果所有值都为NULL,那么返回NULL
      举例:select coalesce(uuid,’’) as uuid from dw.topic_order where partition_pay_date = ‘2016-04-22’
  • 条件判断函数:CASE
    • 语法:CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END
      说明:如果 a 等于 b ,那么返回 c ;如果 a 等于 d ,那么返回 e ;否则返回 f
      举例:select object_id,user_id,uuid, case when client_type like ‘ip%’ then 'ios’when client_type like ‘andr%’ then ‘android’ else ‘other’ end as utm_mediumfrom dw.topic_order where partition_pay_date = ‘2016-04-22’
      注意:相对而言,case when是最全的条件函数,可以用于判断多种条件;次之是if函数,属于二分判断;最后是coalesce函数,该函数只能对空值和非空进行判断。

统计函数

  • 个数统计函数:count

    • 语法:count(), count(expr), count(DISTINCT expr[, expr_.])。count()统计检索出的行的个数,包括NULL值的行;count(expr)返回指定字段的非空值的个数;count(DISTINCT expr[, expr_.])返回指定字段的不同的非空值的个数
  • 总和统计函数:sum
    • 语法:sum(col), sum(DISTINCT col)。sum(col)统计结果集中col的相加的结果;sum(DISTINCT col)统计结果中col不同值相加的结果
  • 平均值统计函数:avg
    • 语法:avg(col), avg(DISTINCT col)。avg(col)统计结果集中col的平均值;avg(DISTINCT col)统计结果中col不同值相加的平均值
  • 最小值统计函数:min
    • 语法:min(col)。 统计结果集中col字段的最小值
  • 最大值统计函数:max
    • 语法:max(col)。统计结果集中col字段的最大值
  • 中位数函数:precentile语法: percentile(BIGINT col, p)。求准确的第pth个百分位数,p必须介于0和1之间,但是col字段目前只支持整数,不支持浮点数类型。

以上就是Hive的函数声明,还有很多,我这里就只列出来我觉得很重要的一部分,看着是不是很像SQL对吧,哈哈哈。其实也不难的。那么,我们来说说它和数据库的异同。

由于Hive采用了SQL的查询语言HQL,因此很容易将Hive理解为数据库。其实从结构上来看,Hive和数据库除了拥有类似的查询语言,再无类似之处。数据库可以用在Online的应用中,但是Hive是为数据仓库而设计的,清楚这一点,有助于从应用角度理解Hive的特性。

Hive和数据库的比较如下表:

总结:Hive 具有 SQL 数据库的外表,但应用场景完全不同,Hive 只适合用来做海量离线数 据统计分析,也就是数据仓库。

大数据Hive其实一点都不难,从入坑到放弃?不存在的相关推荐

  1. 每天20分钟,只需一年,一年级学生英语听力达到六年级水平!关键是坚持一点都不难!

    导读: 除了语文数学这种常规科目,最让家长们焦虑的就是英语.现在的孩子,英语启蒙都很早,但是对英语的兴趣总是开始还可以,越往后越没动力和兴趣,稍微遇到点挫折就不想坚持了.钱也花了,好老师也请了,补习班 ...

  2. 做减法才是真本事,别以为你很能学,做加法一点都不难

    文章目录 顶级的高手才敢做减法 前言 一.做减法才是真本事 二.大数据梦想联盟活动开启 顶级的高手才敢做减法 前言 大多数人不懂,不会,不做,才是你的机会,你得行动,不能畏首畏尾 大数据等于趋势,一个 ...

  3. 2021年大数据Hive(十二):Hive综合案例!!!

    全网最详细的大数据Hive文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Hive综合案例 一.需求描述 二.项目表的字段 三.进 ...

  4. 2021年大数据Hive(十一):Hive调优

    全网最详细的大数据Hive文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Hive调优 一.本地模式 1.空key处理 二.SQL ...

  5. 2021年大数据Hive(九):Hive的数据压缩

    全网最详细的大数据Hive文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Hive的数据压缩 一.MR支持的压缩编码 二.压缩配置 ...

  6. 2021年大数据Hive(四):Hive查询语法

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 hive查询语法 一.SELECT语句 1.语句结构 2.全表查 ...

  7. 2021年大数据Hive(二):Hive的三种安装模式和MySQL搭配使用

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive的三种安装模式和MySQL搭配使用 一.Hive的安装方 ...

  8. 2021年大数据Hive(一):​​​​​​​Hive基本概念

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 历史文章 前言 Hive基本概念 一.Hive介绍 1.什么是Hive 2.为什么使 ...

  9. Hive大数据-Hive的安装与启动---大数据之Hive工作笔记0005

    然后我们再去看这个hive的安装,其实正确的学习路径应该是,首先去看 一下hadoop,因为大数据中,很多知识都是基于hadoop的,然后再去看hive,然后再去 看hbase,spark,flink ...

最新文章

  1. 一文详细介绍深度学习的各种卷积操作
  2. 【 C 】用动态数组实现堆栈
  3. xcode新版本single view_动态数组函数系列1|概况-跟以往Excel版本完全不一样玩法的函数...
  4. 把html追加到指定id后面,javascript – jQuery,动态追加元素时增加id号
  5. php json与接口的使用,api接口与json
  6. 51nod-正整数分组问题(基础方程DP-01背包)
  7. ubuntu16.04下下载baiduyun大文件
  8. SAP Spartacus cost center list的数据源分析
  9. 手把手教你dns服务器未响应导致无法上网怎么办
  10. Cognos值提示设置小技巧
  11. mysql建立作业_mysql创建作业及问题解决
  12. pySpark加载数据
  13. python高级编程总结
  14. 【十六】Jmeter:目录介绍
  15. Egret3D初步笔记二 (Unity导出场景使用)
  16. linux 源码安装 Nginx
  17. java 云服务器 linux,云服务器Linux部署JavaWeb项目
  18. java程序: 倒计时的小程序 (GridPane, Timer, Calendar, SimpleDateFormat ...)
  19. 写给本命年24岁的自己和你:这一年决定你的未来
  20. 【21天学习挑战赛】哪吒邀你参加Java研讨班

热门文章

  1. 树莓派html5播放器,QT+树莓派实现一个简单的播放器
  2. obs64位捕获yy开播伴侣
  3. 价值1000块!关于敏捷项目管理的豆瓣高分推荐书单
  4. 虫洞 Wormhole
  5. POJO 与javaBean(普通bean和EJB)
  6. Java_obj(一)
  7. stripped 和 not stripped
  8. FreeFEM++根据给定网格尺寸剖分网格
  9. BAT机器学习面试1000题系列(详细版)
  10. 手机邮箱怎么弄_我的手机邮箱怎么设置