Pig和Hive之间的区别?为什么两者都有?[关闭]


256

我的背景-在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)可以达到目的时,同时拥有这两个目标是什么?仅仅是因为Pig被Yahoo传播了!和Hive by Facebook?


24
Hive用于结构化数据。Pig用于非结构化数据。
Dead Programmer

Answers:


151

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


艾伦(Alan)还在下面的共享j03m中专门讨论了Hive。他的好东西!
Dolan Antenucci 2012年

14
Hive用于结构化数据。Pig用于非结构化数据。
Dead Programmer

7
我很困惑。您是否想说“ [ Pig等程序语言的有用性”?因为该文章反复声称“猪拉丁语是程序性的”。
马特·芬威克

4
我不确定这是否是临时的,但这篇文章似乎已经消失了。您可以更新链接吗(我无法通过快速搜索找到它)?
Peter Klipfel 2014年

1
艾伦·盖茨后在这里..请通过它去.. developer.yahoo.com/blogs/hadoop/...
Mr.Chowdary

57

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

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

最后-这与问题不直接相关-Hive是用于执行分析查询的框架。尽管它的主要用途是查询平面文件,但没有理由不能查询其他存储。当前,Hive可用于查询存储在Hbase(与大多数RDBMS的内脏类似的键值存储)中的数据,并且HadoopDB项目已使用Hive查询联合的RDBMS层。


37

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

它专门讨论了Pig vs Hive以及他们在雅虎工作的时间和地点。我发现这很有见地。一些有趣的注意事项:

在对数据集进行增量更改/更新时:

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

通过流使用其他工具时:

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

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

在两种情况下,关系模型和SQL都是最合适的。确实,从其大部分历史来看,数据仓库一直是SQL的核心用例之一。它具有正确的结构来支持分析人员想要使用的查询和工具的类型。工具和用户已在现场使用它。

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


1
+1很高兴能与Yahoo进行比较,根据我对Pig的原始创建者的了解,或者至少是一个非常大的支持者。编辑:从雅各布上面,我看到作者(艾伦·盖茨)是Yahoo的Pig建筑师-份额很大:)
Dolan Antenucci 2012年

3
链接已死。我认为目前正确的网址是:https : //developer.yahoo.com/blogs/hadoop/pig-hive-yahoo-464.html
agarie

1
以上更新的链接
j03m 2014年


找不到上面共享的2个链接。
Keshav Pradeep Ramanath

28

在“ dezyre”文章的坚果壳中查看Pig vs Vive的比较

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

一些差异:

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

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

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

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

  5. Hive可以启动可选的基于Thrift的服务器,而PIG无法

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

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

  8. Pig还支持用于执行外部联接的其他COGROUP功能,但蜂巢则不支持。但是,Hive和PIG都可以动态加入,排序和排序


17

我相信,对您的问题的真正答案是,它们是/是独立的项目,没有统一的目标。他们很早就处于不同的空间,随着两个项目的扩展,它们随着时间的推移逐渐重叠。

从Hadoop O'Reilly的书中解释:

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

蜂巢:分布式数据仓库


22
Hive与RDBMS完全不同。它像Pig一样处理平面文件。他们基本上都做同样的事情。查看他们在编译作业时使用的优​​化器,因为这是最大的实际差异。
史蒂夫·谢弗伦斯

12

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

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

还值得注意的是,对于Hive,您可以使用一个不错的界面来处理此数据(用于HUE的Beeswax或Hive Web界面),并且还为您提供了有关数据信息(架构等)的元存储,该信息对于有关您的数据的中央信息。

我将Hive和Pig都用于不同的查询(我使用该查询可以更快/更轻松地编写查询,大多数情况下是通过即席查询执行的)-它们可以使用相同的数据作为输入。但是目前,我正在通过Beeswax做很多工作。


12

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

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

猪也使用惰性评估。与像Hive这样的SQL语言相比,它可以更轻松地进行编程,并且可以使用它以不同的方式以更多的自由度分析数据。因此,如果您真的想分析所拥有的一些非结构化数据中的矩阵或模式,并想对它们进行有趣的计算,那么使用Pig可以走一段合理的距离,而使用Hive则需要其他处理结果的方法。

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

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


10

蜂巢与猪

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

PIG更像是ETL管道。具有逐步的命令,例如声明变量,循环,迭代,条件语句等。

当我想编写复杂的逐步逻辑时,相对于配置单元QL,我更喜欢编写Pig脚本。当我可以编写单个SQL来提取数据时,我希望使用Hive。对于配置单元,您将需要在查询之前定义表(就像在RDBMS中一样)

两者的目的是不同的,但在幕后,两者的作用相同,转换为map reduce程序。Apache开源社区也在这两个项目中添加了越来越多的功能



7
  1. 猪拉丁是数据流的风格,更适合软件工程师。尽管sql更适合于习惯于sql的分析人员。对于复杂的任务,对于配置单元,您必须手动创建临时表来存储中间数据,但对于Pig而言则不必要。

  2. 猪拉丁文适用于复杂的数据结构(如小图)。猪中有一个名为DataBag的数据结构,它是Tuple的集合。有时您需要计算涉及多个元组的指标(元组之间存在隐藏的链接,在这种情况下,我将其称为图形)。在这种情况下,编写UDF来计算涉及多个元组的度量非常容易。当然可以在蜂巢中完成,但是它不像在猪中那样方便。

  3. 在我看来,用猪写UDF比用Hive容易得多。

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

  5. 您可以在本地环境中调试Pig脚本,但对于蜂巢而言,这样做很难。原因是第3点。您需要在本地环境中设置配置单元元数据,这非常耗时。




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最适用于数据仓库应用程序,在该应用程序中维护并挖掘大量数据集以获取见解,报告等。


4

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

一旦获得处理后的数据,该处理后的数据将保存在HDFS中,以供以后处理以获得所需的结果。

在存储的已处理数据之上,我们将应用HIVE SQL命令以获得所需的结果,此配置单元sql命令在内部运行MAP Reduce程序。


这实际上不是对知识库的有意义的补充。尝试添加更多信息
agconti 2014年

4

简而言之,要给出这两者的非常高级的概述:

1)猪是hadoop的关系代数

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


代数比较很有趣
Ravindra babu 2016年

3

在PIG中无法做到的HIVE可以做什么?

可以使用HIVE进行分区,但不能使用PIG进行分区,这是绕过输出的一种方法。

在HIVE中无法做到的什么PIG可以做?

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

另一个根本的区别是,PIG不需要使用架构来写入值,而HIVE则需要使用架构。

您可以使用JDBC等将任何外部应用程序连接到HIVE,但不能使用PIG。

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


3

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

因此,它在内部包含2个主要活动:

1)加载数据处理

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

加载/数据处理-> Pig将对此有所帮助。

这可以作为ETL使用(我们可以使用Pig脚本执行etl操作。)。

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

蜂巢:它构建在hdfs之上,用于仓库处理。

我们可以使用配置单元从猪生成的已处理内容中轻松生成临时报告。


1

猪吃什么!意味着它可以消耗非结构化数据。

蜂巢需要一个架构。


1

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

当您需要运行临时查询或只想浏览数据时,Hive会大放异彩。有时它可以充当可视化层(Tableau / Qlikview)的界面。

两者都是必不可少的,并且具有不同的目的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.