Apache Pig和Apache Hive有什么区别?

时间:2012-04-23 11:47:47

标签: hadoop hive apache-pig bigdata

Pig和Hive之间的确切区别是什么?我发现两者都具有相同的功能意义,因为它们用于做同样的工作。唯一的事情就是两种情况都有所不同。那么何时使用和哪种技术?两者的规格是否明确显示了两者在适用性和性能方面的差异?

5 个答案:

答案 0 :(得分:37)

Apache Pig和Hive是两个在Hadoop之上的项目,为使用Hadoop的MapReduce库提供了更高级的语言。 Apache Pig提供了一种脚本语言,用于描述读取,过滤,转换,连接和写入数据等操作 - 这正是MapReduce最初设计的操作。 Pig不是将这些操作表示在直接使用MapReduce的数千行Java代码中,而是让用户使用与bash或perl脚本不同的语言表达它们。 Pig非常适合原型设计和快速开发基于MapReduce的作业,而不是用Java本身编写MapReduce作业。

如果Pig是“为Hadoop编写脚本”,那么Hive就是“Hadoop的SQL查询”。 Apache Hive提供了一种更具体和更高级别的语言,用于通过运行Hadoop作业来查询数据,而不是直接编写Hadoop上几个MapReduce作业的操作步骤。根据设计,该语言非常类似于SQL。 Hive仍然是一种用于长期运行批量数据查询的工具;它在任何意义上都不是“实时”的。对于习惯于类似SQL的查询和商业智能系统的分析师和业务开发类型,Hive是一个很好的工具;它将让他们轻松利用您闪亮的新Hadoop集群来执行即席查询或生成存储在上述存储系统中的数据的报告数据。

答案 1 :(得分:7)

从纯粹的工程角度来看,我发现PIG比SQL语言更容易编写和维护。它是程序性的,所以你将一堆关系逐个应用于你的数据,如果出现问题,你可以在中间步骤轻松调试,甚至还有一个名为“说明”的命令,它使用算法来采样一些数据匹配你的关系。我说对于具有复杂逻辑的工作,这肯定比Hive更方便,但对于简单的东西,增益可能很小。

关于接口,我发现与Hive相比,PIG提供了很大的灵活性。你没有PIG中的表概念,所以你直接操作文件,你可以定义加载器,使用加载器UDF很容易地将它加载到几乎任何格式,而不必通过表加载阶段,然后你可以做到转换。它们在最近的PIG版本中有一个很好的功能,你可以使用动态调用程序,即在你的PIG脚本中直接使用几乎任何Java方法,而不必编写UDF。

对于性能/优化,从我所见,您可以直接在PIG中控制您想要使用的连接和分组算法的类型(我相信每种算法有3或4种不同的算法)。我个人从未使用它,但是当你编写要求很高的算法时,能够决定做什么而不是依赖于优化器可能是有用的,就像Hive中的情况一样。所以我不会说它必然比Hive表现更好,但是在优化器做出错误决定的情况下,您可以选择使用哪种算法并对发生的事情有更多控制。

我最近做的一件很酷的事情就是分裂:你可以分割你的执行流程,并为每个分裂应用不同的关系。因此,您可以拥有一个非线性数据集,根据字段对其进行拆分,并对每个部分应用不同的处理,并最终将结果连接在一起,所有这些都在同一个脚本中。我不认为你可以在Hive中做到这一点,你必须为每个案例写不同的查询,但我可能是错的。

还有一点需要注意的是,您可以在PIG中增加计数器。目前,您只能在PIG UDF中执行此操作。我不认为你可以在Hive中使用计数器。

还有一些不错的项目允许您将PIG与Hive(如HCatalog)连接,因此您基本上可以从蜂巢表中读取数据,或者通过简单地更改您的数据将数据写入蜂巢表(或两者)脚本中的加载程序。也支持动态分区。

答案 2 :(得分:3)

Apache Pig是一个分析大型数据集的平台。 Pig的语言Pig Latin是一个简单的查询代数,它允许您表达数据转换,例如合并数据集,过滤它们,以及将函数应用于记录或记录组。用户可以创建自己的功能来进行专用处理。

Pig Latin查询在群集上以分布式方式执行。我们当前的实现将Pig Latin程序编译为Map-Reduce作业,并使用Hadoop集群执行它们。

https://cwiki.apache.org/confluence/display/PIG/Index%3bjsessionid=F92DF7021837B3DD048BF9529A434FDA

Hive是Hadoop的数据仓库系统,可以方便地进行数据汇总,即席查询以及分析存储在Hadoop兼容文件系统中的大型数据集。 Hive提供了一种机制,用于将结构投影到此数据上,并使用类似SQL的语言HiveQL查询数据。同时,这种语言还允许传统的map / reduce程序员在HiveQL中表达这种逻辑时不方便或效率低下时插入自定义映射器和缩减器。

https://cwiki.apache.org/Hive/

答案 3 :(得分:3)

  

Pig和Hive之间的确切区别是什么?我发现两者都具有相同的功能意义,因为它们用于做同样的工作。

dezyre文章的nut shell中查看 Pig Vs Hive 比较

分区,服务器,网络界面和分区,服务器,网络界面和 分数 PIG JDBC / ODBC支持

一些差异:

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

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

  3. Hive 用作 声明性SQL & PIG 用作 程序语言

  4. Hive 支持 分区 & PIG

  5. Hive 可以启动可选的 基于thrift的服务器 & PIG 不能

  6. Hive 预先定义表格 (架构) +将架构信息存储在数据库中 PIG 没有数据库的专用元数据

  7. Hive 不支持Avro,但 PIG

  8. Pig 还支持其他 COGROUP 功能,可用于执行外连接,但配置单元不支持。但是 Hive& PIG 可以 加入,订购&动态排序

  9.   

    那么什么时候使用哪种技术?

    以上差异澄清了您的查询。

    HIVE:结构化数据,类似查询的SQL,用于报告目的

    PIG:半结构化数据,编写涉及Map Reduce工作的一系列活动的工作流程。

    关于作业的效果,与传统的Map Reduce作业相比,HIVEPIG都很慢。 Reason:最后,必须将Hive或PIG脚本转换为一系列Map Reduce作业。

    看看相关的SE问题:

    Pig vs Hive vs Native Map Reduce

答案 4 :(得分:0)

主要区别在于PIG是数据流语言,Hive是数据仓库。 由于PIG可以像逐步程序语言一样使用。 但HIVE被用作声明性语言。 PIG可用于获取在线流式非结构化数据。但HIVE只能访问结构化数据,它还可以使用JDBC和ODBC驱动程序从RDBMS数据库(如SQL,NOSQL)访问数据。 PIG可以将数据转换为Avro格式,但PIG不能。 PIG无法创建分区,但HIVE可以做到这一点。 由于HIVE是PIG的首选,因此HIVE只能在PIG处理后访问数据。 这取决于我们必须使用PIG和HIVE,如果您正在使用结构化的关系数据,那么我们可以使用HIVE,否则我们可以使用PIG。 通过PIG,我们可以与ETL工具进行通信,但与蜂巢相比需要更多时间。但是在PIG中很容易感染HIVE,因为在HIVE中我们必须在处理数据之前创建表格。