与数据库比较
我们已经展示了如何使用Pig。看上去,Pig Latin和SQL很相似。GROUP BY和DESCRIBE这样的操作更加强了这种感觉。但是,两种语言之间,以及Pig和RDBMS之间,有几个方面是不同的。
它们之间最显著的不同是:Pig Latin是一种数据流编程语言,而SQL是一种描述 型编程语言。换句话说,一个Pig Latin程序是相对于输入的一步步操作。其中每 一步都是对数据的一个简单的变换。相反,SQL语句是一个约束的集合。这些约 束结合在一起,定义了输出。从很多方面看,用Pig Latin编程更像在RDBMS中 “查询规划器”(query planner)这一层对数据进行操作。查询规划器决定了如何将 描述型语句转化为一系列系统化执行的步骤。
RDBMS把数据存储在严格定义了模式的表内。Pig对它所处理的数据要求则宽松 得多:可以在运行时定义模式,而且这是可选的。本质上,Pig可以在任何来源的 元组上进行操作(当然,数据源必须支持并行的读操作,例如存放在多个文件中)。 它使用UDF从原始格式中读取元组。①最常用的输入格式是用制表符分隔的字段 组成的文本文件。?丨8为这种输入提供了内置加载函数。和传统的数据库不同,Pig 并不提供专门的数据导入过程将数据加载到RDBMS。在第一步处理中,数据是从 文件系统(通常是110?8)中加载的。
Pig对复杂、嵌套数据结构的支持也使其不同于能处理平面数据类型的SQL。Pig 的语言能够和UDF以及流式操作紧密集成。它的这一能力及其嵌套数据结构,使 Pig Latin比大多数SQL的变种具有更强的定制能力。
几个支持在线和低延迟査询的特性是RDBMS有但Pig没有的,例如事务和索引。 如前所述,Pig并不支持随机读和几十毫秒级别的查询。它也不支持对一小部分数 据的随机写。和MapReduce一样,所有的写都是批量的、流式的写操作。
Hive<在第12章中介绍)介于Pig和传统的RDBMS之间。和Pig样,Hive也被设 计为用HDFS作为存储。但是它们之间有着显著的区别。Hive的査询语言 HiveQL,是基于SQL的。任何熟悉SQL的人都可以轻松使用HiveQL写査询。和 RDBMS相同,Hive要求所有数据必须存储在表中,表必须有模式,而模式由 Hive进行管理。但是,Hive允许为预先存在于HDFS的数据关联一个模式。所 以,数据的加载步骤是可选的。和Pig一样,Hive也不支持低延迟查询。