《Hive编程指南》

2021-12-08 18:55:52 浏览数 (1)

前言

  • HiveHadoop生态系统中必不可少的一个工具,它提供了一种SQL(结构化查询语言)方言,可以查询存储在Hadoop分布式文件系统(HDFS)中的数据或其他和Hadoop集成的文件系统,如MapRFSAmazonS3和像HBaseHadoop数据库)和Cassandra这样的数据库中的数据

第1章 基础知识

  • Hadoop生态系统就是为处理如此大数据集而产生的一个合乎成本效益的解决方案。Hadoop实现了一个特别的计算模型,也就是MapReduce,其可以将计算任务分割成多个处理单元然后分散到一群家用的或服务器级别的硬件机器上,从而降低成本并提供水平可伸缩性。这个计算模型的下面是一个被称为Hadoop分布式文件系统(HDFS)的分布式文件系统。这个文件系统是“可插拔的
  • Hive提供了一个被称为Hive查询语言(简称HiveQLHQL)的SQL方言,来查询存储在Hadoop集群中的数据
  • Hive可以将大多数的查询转换为MapReduce任务(job),进而在介绍一个令人熟悉的SQL抽象的同时,拓宽Hadoop的可扩展性
  • Hive最适合于数据仓库应用程序,使用该应用程序进行相关的静态数据分析,不需要快速响应给出结果,而且数据本身不会频繁变化
  • Hive不是一个完整的数据库。Hadoop以及HDFS的设计本身约束和局限性地限制了Hive所能胜任的工作。其中最大的限制就是Hive不支持记录级别的更新、插入或者删除操作。但是用户可以通过查询生成新表或者将查询结果导入到文件中
  • 因为Hadoop是一个面向批处理的系统,而MapReduce任务(job)的启动过程需要消耗较长的时间,所以Hive查询延时比较严重。传统数据库中在秒级别可以完成的查询,在Hive中,即使数据集相对较小,往往也需要执行更长的时间[1]
  • Hive不支持事务
  • Hive不支持OLTP(联机事务处理)所需的关键功能,而更接近成为一个OLAP(联机分析技术)工具

图1-1 使用MapReduce执行WordCount算法

  • Hadoop神奇的地方一部分在于后面要进行的Sort(排序)和Shuffle(重新分发)过程。Hadoop会按照键来对键值对进行排序,然后“重新洗牌”,将所有具有相同键的键值对分发到同一个Reducer中。这里有多种方式可以用于决定哪个Reducer获取哪个范围内的键对应的数据

图1-2显示了Hive的主要“模块”以及Hive是如何与Hadoop交互工作的

  • 对于那些更喜欢图形用户界面的用户,可以使用现在逐步出现的商业和开源的解决方案,例如Karmasphere发布的一个商业产品(http://karmasphere.com),Cloudera提供的开源的Hue项目(https://github.com/cloudera/hue),以及Qubole提供的“Hive即服务”方式(http://qubole.com),等
  • Hive最适合于数据仓库程序,对于数据仓库程序不需要实时响应查询,不需要记录级别的插入、更新和删除
  • Hive的替代工具中最有名的就是Pig了(请参考http://pig.apache.org)。Pig是由Yahoo!开发完成的,而同时期Fackbook正在开发HivePig现在同样也是一个和Hadoop紧密联系的顶级Apache项目
  • Pig被描述成一种数据流语言,而不是一种查询语言。在Pig中,用户需要写一系列的声明语句来定义某些关系和其他一些关系之间的联系,这里每个新的关系都会执行新的数据转换过程。Pig会查找这些声明,然后创建一系列有次序的MapReduce任务(job),来对这些数据进行转换,直到产生符合用户预期的计算方式所得到的最终结果
  • 这种步进式的数据“流”可以比一组复杂的查询更加直观。也因此,Pig常用于ETL(数据抽取,数据转换和数据装载)过程的一部分,也就是将外部数据装载到Hadoop集群中,然后转换成所期望的数据格式
  • 如果用户需要Hive无法提供的数据库特性(如行级别的更新,快速的查询响应时间,以及支持事务)的话,那么该怎么办呢?
  • HBase是一个分布式的、可伸缩的数据存储,其支持行级别的数据更新、快速查询和行级事务(但不支持多行事务)
  • HBase的设计灵感来自于谷歌(Google)的BigTable,不过HBase并没有实现BigTable的所有特性。HBase支持的一个重要特性就是列存储,其中的列可以组织成列族。列族在分布式集群中物理上是存储在一起的。这就使得当查询场景涉及的列只是所有列的一个子集时,读写速度会快得多
  • 可以像键值存储一样来使用HBase,其每一行都使用了一个唯一键来提供非常快的速度读写这一行的列或者列族。HBase还会对每个列保留多个版本的值(按照时间戳进行标记),版本数量是可以配置的
  • HBase使用HDFS(或其他某种分布式文件系统)来持久化存储数据。为了可以提供行级别的数据更新和快速查询,HBase也使用了内存缓存技术对数据和本地文件进行追加数据更新操作日志。持久化文件将定期地使用附加日志更新进行更新等操作

表1-2 没有使用MapReduce的分布式处理工具

第2章 基础操作

  • Hive提供了这样的功能,因为CLI可以接受e命令这种形式。如果表mytable具有一个字符串字段和一个整型字段,我们可以看到如下输出:
  • Hive中可以使用–f文件名方式执行指定文件中的一个或者多个查询语句。按照惯例,一般把这些Hive查询文件保存为具有.q或者.hql后缀名的文件

第23章 案例研究

M6d.com

M6D 的数据科学,使用 Hive 和 R

  • m6d是一家面向展示广告的公司。我们所扮演的角色就是通过创建定制的机器学习算法来为广告宣传活动寻找最好的新前景
  • 我们团队的几个数据科学家对于统计学习使用的主要工具是RR提供了众多的包来支持众多的统计算法。更重要的是,我们对于R具有很多的经验,我们知道其是如何执行的,并了解它们的特性,而且非常熟悉其技术文档。不过,R的一个主要缺点是,默认情况下其需要将所有的数据集载入到内存中。这是一个主要的限制。还有就是,一旦R中的数据比可以载入内存的数据要大时,系统就会出现内存交换,导致系统抖动并显著降低处理速度[1]

Outbrain

Outbrain 是领先的内容发现平台

  • 当用户想查看网站的流量情况时,很难弄清楚这些流量实际来源于哪里,特别是来源于用户网站之外的流量情况。如果用户的网站具有很多结构不同的URL的话,那么就无法简单地将所有的链接URL和用户登录页面进行匹配
对 URL 进行清洗
  • 我们期望达到的目的就是可以将链入的链接分成站内的、直接链入的或其他3个分组
Determining referrer type
  • 如果链入的链接是空的或者值为null,那么我们将其标记为直接链入的那组
  • 我们可以很容易地通过如下查询来添加链接类型
Multiple URL
  • 如果我们使用的是一个广告网络呢?如果我们有成百上千的网站呢?如果每个站点可以有任意数量的URL结构呢?
  • 我们可能也有一个包含每个URL的表,以及它属于什么类型的网站。让我们将这张表命名为site_url,其有如下2个字段:
  • 通过每个链入网址,看它是否与任何相同的站点ID匹配。如果是匹配的话,那么这是一个站内链接,否则不是站内链接。所以,让我们通过如下查询进行确认

0 人点赞