Pig和Hive有什么区别?我发现两者都具有相同的功能意义,因为它们用于做同样的工作.唯一的事情就是两种情况都有所不同.那么何时使用和哪种技术?两者的规格是否明确显示了两者在适用性和性能方面的差异?
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集群来执行即席查询或生成存储在上述存储系统中的数据的报告数据.
从纯粹的工程角度来看,我发现PIG比SQL语言更容易编写和维护.它是程序性的,所以你将一堆关系逐个应用于你的数据,如果出现问题,你可以在中间步骤轻松调试,甚至还有一个名为"说明"的命令,它使用算法来采样一些数据匹配你的关系.我说对于具有复杂逻辑的工作,这肯定比Hive更方便,但对于简单的东西,增益可能是最小的.
关于接口,我发现与Hive相比,PIG提供了很大的灵活性.您没有PIG中的表概念,因此您可以直接操作文件,并且您可以使用加载程序UDF定义加载程序以将其加载到几乎任何格式,而无需在执行之前完成表加载阶段转换.它们在最近的PIG版本中有一个很好的功能,你可以使用动态调用程序,即在你的PIG脚本中直接使用几乎任何Java方法,而不必编写UDF.
对于性能/优化,从我看到你可以直接控制PIG中你想要使用的连接和分组算法的类型(我相信每个算法有3或4种不同的算法).我个人从未使用它,但是当你编写要求很高的算法时,能够决定做什么而不是依赖于优化器可能是有用的,就像在Hive中一样.所以我不会说它必然比Hive表现更好,但是在优化器做出错误决定的情况下,你可以选择使用什么算法并对发生的事情有更多的控制.
我最近做的一件很酷的事情就是分裂:你可以分割你的执行流程,并为每个分裂应用不同的关系.因此,您可以拥有一个非线性数据集,根据字段对其进行拆分,并对每个部分应用不同的处理,并最终将结果连接在一起,所有这些都在同一个脚本中.我不认为你可以在Hive中做到这一点,你必须为每个案例写不同的查询,但我可能是错的.
还有一点需要注意,你可以在PIG中增加计数器.目前,您只能在PIG UDF中执行此操作.我不认为你可以在Hive中使用计数器.
还有一些不错的项目允许您将PIG与Hive(如HCatalog)连接,因此您基本上可以从蜂巢表读取数据,或者通过简单地更改您的加载程序将数据写入蜂巢表(或两者)脚本.也支持动态分区.