加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

大数据开发之路:hive篇,你看了吗?

发布时间:2019-05-17 03:37:11 所属栏目:教程 来源:金灿灿
导读:引语 大数据开发之路漫漫其修远兮,吾将上下而求索。很多入门大数据的小伙伴,可能第一个接触到的,就是一只可爱的小象,也就是我们的大数据领域的数据仓库工具hive。 这只小象给我们提供了方便类SQL查询语言HQL来操纵数据,使得我们一开始不用编写复杂的
副标题[/!--empirenews.page--]

引语

大数据开发之路漫漫其修远兮,吾将上下而求索。很多入门大数据的小伙伴,可能第一个接触到的,就是一只可爱的“小象”,也就是我们的大数据领域的数据仓库工具hive。

这只小象给我们提供了方便类SQL查询语言HQL来操纵数据,使得我们一开始不用编写复杂的代码,就可以轻松的探索数据。Hive对于熟悉传统数据库的同学来说,算是很友好的一个入门工具。

原理

在大数据生态中,hive一般作为数据仓库来使用。什么是数据仓库呢? 简单来说就像一个大粮仓,里边堆着各种各样的粮食,比如小麦、玉米、土豆、大米等等。数据仓库里是一个数据集合体,把不同数据源按照一定的形式集合统一起来。 Hive本身是不做数据存储的,它是构建在分布式存储系统HDFS之上,我们平常看到的表数据其实本质上来说还是HDFS的文件。 Hive把这些HDFS数据文件,通过元数据规则映射为数据库的表,并且可以提供SQL操作的功能。 Hive总体结构比较简单,下方是整体的hive架构图,我们可以看到,总体有三个组件:用户接口、元数据系统、驱动器。

大数据开发之路:hive篇,你看了吗?

用户通过用户接口来输入操作指令。一般接口有三种形式:

  • CLI端:一般在linux服务器直接输入hive即可进入;
  • WEB模式:通过命令bin/hive --service hwi启动,默认访问9999端口;
  • 远程模式:一般是JDBC之类的编程接口;

Hive的核心在于驱动器,一般驱动器接收到用户接口传递的一条SQL之后,会进行下面的一系列操作:

  • 驱动器开始进行语法和语义分析
  • 生成逻辑计划并且逻辑优化
  • 生成物理计划
  • 发送计划到执行引擎(常用引擎有mapredue和sprk)执行

结果返回

而元数据系统一般传统数据库来承载,主要记录了包括hive表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。

常用hive语法

了解了hive的基础原理之后呢,我们这里结合工作中一些需求,来介绍下开发同学常用的hive操作。

分组统计

作为一名SQL仔,经常会要去统计一些奇奇怪怪的指标,比如不同年龄段的UV,下单数的小时分布之类的。一般常用的分组就是group by了,然后配合上一些窗口函数, SUM、AVG、MIN、MAX、COUNT等,就可以实现我们很多统计需求了。比如下边的统计时间段的独立用户数,查询结果如下图所示:

大数据开发之路:hive篇,你看了吗?

关联查询

有时候我们查询的数据存放在不同的表中,那关联查询就派上用场了。所谓关联查询,一般就是通过两张表相同的字段值关联起来,同时查询两张表的记录。Hive中常用关联分内外关联。

我们先建立两张简单的表tab_a和tab_b,用实例来说明关联机制。表结构和表数据如下图所示:

大数据开发之路:hive篇,你看了吗?

内关联一般使用 关键字Join或inner join ,内关联只返回关联上的结果。

外关联的形式就比较多样化了,又分为:

  • 左外关联:关键字为left [outer] join,以前边的表为主表,返回记录数和主表记录一致,关联不上的字段为null;
  • 右外关联:关键字为right [outer] join,和左外关联相反,则是以后边的表为主表。
  • 全外关联:full [outer] join,返回两个表的去重之和,关联不上的字段为null。

行列转换

有时候我们会遇到这样的需求,需要把多列的数据平铺到一行上输出。比如查询用户的访问轨迹,这时候有两个函数就起上作用了。还是让我们先来看看效果。

大数据开发之路:hive篇,你看了吗?

这两个sql的作用都是把每个用户的点击轨迹拼接暂展示出来,其中collect_set和collect_set能够把列数据合并,转为一行。而两个的唯一区别就是collect_set会进行去重。

上述讲的是行转列,还有些需求,希望我们能把列数据拆分成多行,比如数据结构如下,

Page_id StringAd_id Array

  • A[1,2,3]
  • B[3,5,6]
  • C[2,4,5]

要统计每个广告在所有页面出现的次数,这时候,我们可以先把同一列的数据线拆成多行,hive提供了explode展开函数,具体效果如下图:

大数据开发之路:hive篇,你看了吗?

Explode一般配合lateral view使用,把字段内容铺开成虚拟视图。接下来我们再这个基础之上,就可以使用统计函数来进行分析。

大数据开发之路:hive篇,你看了吗?

取TopN记录

给数据分组排序再取前几条记录,也是我们较为常见的需求。hive提供了row_number函数,可以对排序值进行编号。举个栗子,要取省份的温度最高的城市,数据如下:

  • 省份城市温度
  • 广东佛山34
  • 广东广州30
  • 江西赣州31
  • 江西南昌28
  • 江西萍乡29
  • 湖南长沙26
  • 湖南衡阳25

我们可以使用row_number()组合group by的形式,来进行组内排序,并且返回顺序值rank。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读