258

我的背景——在 Hadoop 世界中已有 4 周的历史。使用 Cloudera 的 Hadoop VM 涉足 Hive、Pig 和 Hadoop。已阅读 Google 关于 Map-Reduce 和 GFS 的论文(PDF 链接)。

我明白那个-

  • Pig 的语言 Pig Latin 是从(适合程序员的思维方式)SQL 之类的声明式编程风格的转变,而 Hive 的查询语言与 SQL 非常相似。

  • Pig 位于 Hadoop 之上,原则上也可以位于 Dryad 之上。我可能错了,但 Hive 与 Hadoop 紧密耦合。

  • Pig Latin 和 Hive 命令都编译为 Map 和 Reduce 作业。

我的问题 - 当一个(比如猪)可以达到目的时,两者兼有的目标是什么。仅仅是因为 Pig 被 Yahoo! 传福音了吗?和 Facebook 的 Hive?

4

19 回答 19

152

查看Yahoo! 的 Pig 架构师 Alan Gates的这篇文章,比较了何时使用 Hive 之类的 SQL 而不是 Pig。他提出了一个非常有说服力的案例,说明像 Pig 这样的过程语言(相对于声明性 SQL)的有用性及其对数据流设计者的实用性。

于 2010-07-29T06:56:18.713 回答
57

Hive 旨在吸引熟悉 SQL 的社区。它的理念是我们不需要另一种脚本语言。Hive 支持用户选择的语言的 map 和 reduce 转换脚本(可以嵌入到 SQL 子句中)。它在 Facebook 中被熟悉 SQL 的分析师以及使用 Python 编程的数据挖掘人员广泛使用。Pig 中的 SQL 兼容性工作已被 AFAIK 放弃——因此这两个项目之间的区别非常明显。

支持 SQL 语法还意味着可以与现有的 BI 工具(如 Microstrategy)集成。Hive 有一个 ODBC/JDBC 驱动程序(这是一项正在进行的工作),它应该允许在不久的将来发生这种情况。它还开始添加对索引的支持,这应该允许支持此类环境中常见的向下钻取查询。

最后——这与问题没有直接关系——Hive 是一个用于执行分析查询的框架。虽然它的主要用途是查询平面文件,但它没有理由不能查询其他商店。目前,Hive 可用于查询存储在 Hbase 中的数据(它是一种类似于大多数 RDBMS 内部的键值存储),HadoopDB 项目已使用 Hive 来查询联合 RDBMS 层。

于 2010-08-05T07:23:47.030 回答
38

我发现这是最有帮助的(虽然,它已经一岁了) - http://yahoohadoop.tumblr.com/post/98256601751/pig-and-hive-at-yahoo

它专门讨论了 Pig 与 Hive 以及他们在雅虎受雇的时间和地点。我发现这很有见地。一些有趣的笔记:

关于数据集的增量更改/更新:

相反,连接新的增量数据并将结果与​​先前完全连接的结果一起使用是正确的方法。这只需几分钟。标准数据库操作可以在 Pig Latin 中以这种增量方式实现,使 Pig 成为此用例的好工具。

通过流媒体使用其他工具:

Pig 与流的集成还使研究人员可以轻松地使用他们已经在小型数据集上调试过的 Perl 或 Python 脚本并针对大型数据集运行它。

关于使用 Hive 进行数据仓库:

在这两种情况下,关系模型和 SQL 都是最合适的。事实上,在 SQL 的大部分历史中,数据仓库一直是 SQL 的核心用例之一。它具有正确的结构来支持分析师想要使用的查询类型和工具。它已经被该领域的工具和用户使用。

Hadoop 子项目 Hive 为 Hadoop 提供 SQL 接口和关系模型。Hive 团队已经开始通过 ODBC 等接口与 BI 工具集成。

于 2011-11-22T20:04:31.700 回答
30

看看“dezyre”文章中的坚果壳中的Pig Vs Hive比较

Hive在分区、服务器、Web 界面和 JDBC/ODBC 支持方面优于PIG 。

一些区别:

  1. Hive最适合结构化数据PIG最适合半结构化数据

  2. Hive用于报告PIG用于编程

  3. Hive用作声明性 SQLPIG用作过程语言

  4. Hive支持分区而 PIG不支持

  5. Hive可以启动一个可选的基于节俭的服务器PIG不能

  6. Hive预先定义表(模式)+ 将模式信息存储在数据库中,并且PIG没有数据库的专用元数据

  7. Hive不支持Avro,但PIG支持。编辑:Hive 支持 Avro,将 serde 指定为 org.apache.hadoop.hive.serde2.avro

  8. Pig还支持用于执行外部连接的附加COGROUP功能,但 hive 不支持。但是Hive 和 PIG都可以动态加入、排序和排序

于 2015-10-26T18:45:56.400 回答
17

我相信您问题的真正答案是它们是/曾经是独立项目,并且没有集中协调的目标。他们早期处于不同的空间,随着两个项目的扩展,它们已经随着时间的推移而重叠。

从 Hadoop O'Reilly 的书中转述:

Pig:用于探索非常大的数据集的数据流语言和环境。

Hive:分布式数据仓库

于 2010-07-28T19:08:16.850 回答
12

您可以使用 pig/hive 查询获得类似的结果。主要区别在于理解/编写/创建查询的方法。

Pig 倾向于创建数据流:在每个小步骤中您都进行一些处理
Hive 为您提供了类似 SQL 的语言来操作您的数据,因此从 RDBMS 转换要容易得多(对于没有早期经验的人来说,Pig 可能更容易用 SQL)

还值得注意的是,对于 Hive,您可以使用很好的界面来处理这些数据(HUE 的蜂蜡,或 Hive Web 界面),它还为您提供了有关数据(模式等)的信息的元存储,这可用作有关您的数据的中心信息。

对于不同的查询,我同时使用 Hive 和 Pig(我使用可以更快/更轻松地编写查询的那个,我这样做主要是临时查询)——它们可以使用相同的数据作为输入。但目前我的大部分工作都是通过 Beeswax 完成的。

于 2010-07-28T20:27:20.057 回答
12

Pig 允许在管道中的任何位置加载数据和用户代码。如果数据是流数据,例如来自卫星或仪器的数据,这一点尤其重要。

Hive 基于 RDBMS,需要先导入(或加载)数据,然后才能对其进行处理。因此,如果您在流数据上使用 Hive,您将不得不继续填充存储桶(或文件)并在每个填充的存储桶上使用 hive,同时使用其他存储桶来继续存储新到达的数据。

Pig 也使用惰性求值。它允许更轻松的编程,并且可以使用它以不同的方式分析数据,比使用类似 SQL 的语言(如 Hive)更自由。因此,如果您真的想分析您拥有的一些非结构化数据中的矩阵或模式,并且想对它们进行有趣的计算,那么使用 Pig 您可以走一段相当长的距离,而使用 Hive,您需要其他东西来处理结果。

与 Hive 等 RDBMS 友好语言相比,Pig 的数据导入速度更快,但实际执行速度更慢。

Pig 非常适合并行化,因此它可能在数据集庞大的系统中具有优势,即在您更关心结果吞吐量而不是延迟(获取任何特定结果数据的时间)的系统中。

于 2014-03-22T14:04:13.577 回答
11

蜂巢与猪-

Hive 作为 SQL 接口,允许精通 sql 的用户或其他工具,如 Tableu/Microstrategy/任何其他具有 sql 接口的工具或语言。

PIG 更像是一个 ETL 管道..带有逐步命令,如声明变量、循环、迭代、条件语句等。

当我想编写复杂的逐步逻辑时,我更喜欢编写 Pig 脚本而不是 hive QL。当我愿意编写单个 sql 来提取我想要的数据时,我会使用 Hive。对于配置单元,您需要在查询之前定义表(就像在 RDBMS 中所做的那样)

两者的目的不同,但在幕后,两者都做同样的事情,转换为 map reduce 程序。此外,Apache 开源社区正在为这两个项目添加越来越多的功能

于 2015-12-24T17:55:30.977 回答
8

在此链接中阅读 PIG 和 HIVE 之间的区别。

http://www.aptibook.com/Articles/Pig-and-hive-advantages-disadvantages-features

所有方面都给出了。如果您对选择哪个感到困惑,那么您必须查看该网页。

于 2013-09-05T16:39:25.170 回答
7
  1. Pig-latin 是数据流风格,更适合软件工程师。而 sql 更适合习惯 sql 的分析人员。对于复杂的任务,对于hive,你必须手动创建临时表来存储中间数据,但对于pig,没有必要。

  2. Pig-latin 适用于复杂的数据结构(如小图)。pig 中有一个名为 DataBag 的数据结构,它是元组的集合。有时你需要计算涉及多个元组的指标(元组之间有一个隐藏的链接,在这种情况下我称之为图表)。在这种情况下,很容易编写一个 UDF 来计算涉及多个元组的指标。当然可以在蜂巢中完成,但不如在猪中方便。

  3. 在我看来,在 pig 中编写 UDF 比在 Hive 中容易得多。

  4. Pig 没有元数据支持,(或者它是可选的,将来它可能会集成 hcatalog)。Hive 将表的元数据存储在数据库中。

  5. 您可以在本地环境中调试 pig 脚本,但 hive 很难做到这一点。原因是第3点。需要在本地环境中设置hive元数据,非常耗时。

于 2013-07-15T23:37:30.960 回答
5

我在下面找到了有用的链接来探索如何以及何时使用 HIVE 和 PIG。

http://www.hadoopwizard.com/when-to-use-pig-latin-versus-hive-sql/

于 2013-09-20T07:11:11.013 回答
4

从链接: http ://www.aptibook.com/discuss-technical?uid=tech-hive4&question=What-kind-of-datawarehouse-application-is-suitable-for-Hive ?

Hive 不是一个完整的数据库。Hadoop 和 HDFS 的设计约束和限制对 Hive 的功能施加了限制。

Hive 最适合数据仓库应用程序,其中

1)分析相对静态的数据,

2) 不需要快速响应时间,并且

3) 当数据没有快速变化时。

Hive 不提供 OLTP(在线事务处理)所需的关键功能。它更接近于成为一个 OLAP 工具,在线分析处理。因此,Hive 最适合数据仓库应用程序,其中维护和挖掘大型数据集以获取见解、报告等。

于 2013-09-29T06:00:25.543 回答
4

简单来说,Pig 是一个用于创建与 Hadoop 一起使用的 MapReduce 程序的高级平台,使用 pig 脚本,我们将大量数据处理成所需的格式。

一旦获得处理后的数据,这些处理后的数据就会保存在 HDFS 中,以供以后处理以获得所需的结果。

在存储的处理数据之上,我们将应用 HIVE SQL 命令来获得所需的结果,在内部,这个 hive sql 命令运行 MAP Reduce 程序。

于 2014-01-07T01:56:01.287 回答
4

当我们Hadoop在某种意义上使用它意味着我们正在尝试进行大量数据处理数据处理的最终目标是从中生成内容/报告。

因此,它在内部由 2 个主要活动组成:

1)加载数据处理

2)生成内容并将其用于报告/等。

加载 /Data Processing -> Pig 会有所帮助。

这有助于作为 ETL(我们可以使用 pig 脚本执行 etl 操作。)。

处理完结果后,我们可以使用 hive 根据处理后的结果生成报告。

Hive:它建立在 hdfs 之上,用于仓库处理。

我们可以使用从 pig 生成的已处理内容中的 hive 轻松生成临时报告。

于 2014-05-29T03:45:03.283 回答
4

这里有一些关于使用 Pig 或 Hive 的附加链接。

http://aws.amazon.com/elasticmapreduce/faqs/#hive-8

http://www.larsgeorge.com/2009/10/hive-vs-pig.html

于 2011-08-03T09:10:39.583 回答
4

简而言之,要对两者进行非常高级的概述:

1) Pig 是基于 hadoop 的关系代数

2) Hive 是基于 hadoop 的 SQL(比 Pig 高一级)

于 2014-10-04T07:56:05.493 回答
3

HIVE 能做哪些 PIG 做不到的事情?

分区可以使用 HIVE 而不是在 PIG 中完成,这是一种绕过输出的方法。

在 HIVE 中,PIG 能做到哪些是不可能的?

位置引用 - 即使您没有字段名称,我们也可以使用位置进行引用,例如 $0 - 用于第一个字段,$1 用于第二个字段,依此类推。

另一个根本区别是,PIG 不需要模式来写入值,但 HIVE 确实需要模式。

您可以使用 JDBC 和其他方式从任何外部应用程序连接到 HIVE,但不能使用 PIG。

注意:两者都运行在 HDFS(hadoop 分布式文件系统)之上,并且语句被转换为 Map Reduce 程序。

于 2015-03-29T04:32:59.743 回答
1

猪什么都吃!这意味着它可以使用非结构化数据。

Hive 需要一个模式。

于 2015-02-20T17:55:36.793 回答
1

一般来说,Pig 对于 ETL 类型的工作负载很有用。例如,您每天需要对数据进行的一组转换。

当您需要运行即席查询或只想探索数据时,Hive 会大放异彩。它有时可以充当可视化层 (Tableau/Qlikview) 的接口。

两者都是必不可少的,并且服务于不同的目的。

于 2015-11-13T20:06:14.697 回答