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

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 只适合用来做海量离线数 据统计分析,也就是数据仓库。
发布了36 篇原创文章 · 获赞 13 · 访问量 1052

猜你喜欢

转载自blog.csdn.net/weixin_44598691/article/details/105016295
今日推荐