Pig和Hive之间的确切区别是什么?我发现两者具有相同的功能含义,因为它们用于完成相同的工作。唯一的事情是对两者都不同的实施。那么何时使用以及使用哪种技术?两者是否有任何规范清楚地表明两者在适用性和性能方面的区别?
5 回答
Apache Pig 和 Hive 是位于 Hadoop 之上的两个项目,并为使用 Hadoop 的 MapReduce 库提供了更高级别的语言。Apache Pig 提供了一种脚本语言来描述读取、过滤、转换、连接和写入数据等操作——正是 MapReduce 最初设计的操作。与直接使用 MapReduce 的数千行 Java 代码表达这些操作不同,Pig 允许用户用与 bash 或 perl 脚本不同的语言表达它们。Pig 非常适合原型设计和快速开发基于 MapReduce 的作业,而不是在 Java 本身中编码 MapReduce 作业。
如果 Pig 是“Hadoop 脚本”,那么 Hive 就是“Hadoop 的 SQL 查询”。Apache Hive 提供了一种更具体、更高级的语言,用于通过运行 Hadoop 作业来查询数据,而不是直接在 Hadoop 上逐步编写多个 MapReduce 作业的操作脚本。从设计上讲,该语言非常类似于 SQL。Hive 仍然旨在作为针对海量数据进行长时间运行的面向批处理的查询的工具。它在任何意义上都不是“实时的”。Hive 对于习惯于类似 SQL 的查询和商业智能系统的分析师和业务开发类型来说是一个出色的工具;它将让他们轻松利用您闪亮的新 Hadoop 集群来执行临时查询或跨上述存储系统中存储的数据生成报告数据。
从纯工程的角度来看,我发现 PIG 比类似 SQL 的语言更容易编写和维护。它是程序性的,因此您将一堆关系一个接一个地应用于您的数据,如果出现问题,您可以轻松地在中间步骤进行调试,甚至还有一个名为“illustrate”的命令,它使用算法对一些数据匹配进行采样你的关系。我想说对于具有复杂逻辑的工作,这绝对比 Hive 方便得多,但对于简单的东西,收益可能很小。
关于接口,我发现与 Hive 相比,PIG 提供了很大的灵活性。您在 PIG 中没有表格的概念,因此您可以直接操作文件,并且您可以定义加载程序以使用加载程序 UDF 轻松地将其加载到几乎任何格式,而无需在执行表格加载阶段之前完成您的转变。它们在最近版本的 PIG 中有一个很好的特性,您可以在其中使用动态调用程序,即直接在 PIG 脚本中使用几乎任何 Java 方法,而无需编写 UDF。
对于性能/优化,据我所知,您可以在 PIG 中直接控制要使用的连接和分组算法的类型(我相信每种算法有 3 或 4 种不同的算法)。我个人从未使用过它,但是当您编写要求苛刻的算法时,能够决定要做什么而不是像 Hive 中那样依赖优化器可能会很有用。所以我不会说它一定比 Hive 表现得更好,但在优化器做出错误决定的情况下,您可以选择使用哪种算法并对发生的事情有更多控制权。
我最近做的一件很酷的事情是拆分:您可以拆分执行流程并将不同的关系应用于每个拆分。因此,您可以拥有一个非线性数据集,根据字段对其进行拆分,并对每个部分应用不同的处理,最后可能将结果连接在一起,所有这些都在同一个脚本中。我认为您不能在 Hive 中执行此操作,您必须为每种情况编写不同的查询,但我可能错了。
还要注意的一件事是您可以在 PIG 中增加计数器。不过,目前您只能在 PIG UDF 中执行此操作。我认为您不能在 Hive 中使用计数器。
还有一些不错的项目允许您将 PIG 与 Hive 进行接口(例如 HCatalog),因此您基本上可以通过简单地更改您的加载器从配置单元表中读取数据,或将数据写入配置单元表(或两者)。脚本。也支持动态分区。
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 提供了一种机制来将结构投影到此数据上,并使用称为 HiveQL 的类似 SQL 的语言查询数据。同时,这种语言还允许传统的 map/reduce 程序员在 HiveQL 中表达这种逻辑不方便或效率低时插入他们的自定义映射器和化简器。
Pig和Hive之间的确切区别是什么?我发现两者具有相同的功能含义,因为它们用于完成相同的工作。
从文章的坚果壳中看一下猪与蜂巢的比较dezyre
Hive在分区、服务器、Web 界面和 JDBC/ODBC 支持方面的得分高于PIG。
一些区别:
Hive最适合结构化数据,PIG最适合半结构化数据
Hive用于报告和PIG用于编程
Hive用作声明性 SQL和PIG用作过程语言
Hive支持分区而 PIG不支持
Hive可以启动一个可选的基于节俭的服务器而PIG不能
Hive 预先定义表(模式) + 将模式信息存储在数据库中,PIG没有数据库的专用元数据
Hive不支持 Avro,但PIG支持
Pig还支持用于执行外部连接的附加COGROUP功能,但 hive 不支持。但是Hive 和 PIG都可以动态加入、排序和排序
那么何时使用以及使用哪种技术?
上述差异澄清了您的查询。
HIVE
:结构化数据、类似 SQL 的查询并用于报告目的
PIG
:半结构化数据,对涉及 Map Reduce 作业的一系列活动的工作流程进行编程。
关于作业的性能,与传统的 Map Reduce 作业相比,两者HIVE
都很PIG
慢。Reason
:最后必须将 Hive 或 PIG 脚本转换为一系列 Map Reduce 作业。
看看相关的 SE 问题:
主要区别在于 PIG 是一种数据流语言,而 Hive 是数据仓库。正如 PIG 可以使用类似的一步一步的程序语言。但是 HIVE 被用作声明性语言。PIG 可用于获取在线流式非结构化数据。但是HIVE只能访问结构化数据,也可以通过JDBC和ODBC驱动访问SQL、NOSQL等RDBMS数据库中的数据。PIG 可以将数据转换为 Avro 格式,但 PIG 不能。PIG 不能创建分区,但 HIVE 可以。由于 HIVE 位于 PIG 之上,因此 HIVE 只能在 PIG 处理数据后才能访问数据。这取决于我们何时必须使用 PIG 和 HIVE,如果您正在处理结构化的关系数据,那么我们可以使用 HIVE,否则我们可以使用 PIG。通过 PIG 我们可以与 ETL 工具进行通信,但与 hive 相比需要更多时间。