【发布时间】:2012-05-04 00:41:52
【问题描述】:
Pig 和 Hive 之间的确切区别是什么?我发现两者具有相同的功能含义,因为它们用于完成相同的工作。唯一的事情是对两者都不同的实施。那么何时使用以及使用哪种技术?是否有任何规范可以清楚地显示两者在适用性和性能方面的差异?
【问题讨论】:
标签: hadoop hive apache-pig
Pig 和 Hive 之间的确切区别是什么?我发现两者具有相同的功能含义,因为它们用于完成相同的工作。唯一的事情是对两者都不同的实施。那么何时使用以及使用哪种技术?是否有任何规范可以清楚地显示两者在适用性和性能方面的差异?
【问题讨论】:
标签: hadoop hive apache-pig
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 之间的确切区别是什么?我发现两者具有相同的功能含义,因为它们用于完成相同的工作。
看看 Pig Vs Hive 比较来自dezyre 文章的nut shell
Hive 在分区、服务器、Web 界面和 JDBC/ODBC 支持方面的得分高于 PIG。
一些区别:
Hive 最适合 结构化数据 & PIG 最适合 半结构化数据
Hive 用于 报告 和 PIG 用于编程 em>
Hive 用作 声明性 SQL 和 PIG 用作 程序语言
Hive 支持 partitions 而 PIG 不支持
Hive 可以启动可选的thrift 服务器 而PIG 不能
Hive 预先定义表 (schema) + 将模式信息存储在数据库和 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 相比需要更多时间。但是在 PIG 而不是 HIVE 中这很容易,因为在 HIVE 中我们必须在处理数据之前创建表。
【讨论】: