第11章Pig

本文介绍了Pig Latin编程语言的基本语法结构,包括语句、表达式和数据类型等核心概念,以及如何构建和执行Pig Latin程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Pig Latin

The command to list the files in a Hadoop filesystem is another example of a statement:

ls /

这部分介绍Pig Latin编程语言的语法、语句信息。本部分不提供对Pig Latin语言的完整的讲解,但是,这部分对于你理解Pig Latin的结构是足够的了。

结构

一个Pig Latin程序由语句的集合构成。一条语句可以被认为是一个操作或者一个命令。例如,一个GROUP操作是一种类型的语句:

grouped_records = GROUP records BY year;

这个命令,列出了Hadoop文件系统中的文件,这是ls/的另一种方式。

语句通常情况下,是以分号结尾的,就像在GROUP语句中一样。事实上,语句必须以分号结尾:忽略它是语法错误的。Ls命令则不必以分号结束。作为一个通用准则,Grunt中的互动的语句或命令不需要以分号作为结尾。Group包括交互的Hadoop命令,就像DESCRIBE这样的诊断命令。写上分号是绝对不会错误的,所以,如果你不确定的话,那么最好的方法就是加上分号。

必须以分号结尾的语句,为了便于阅读,可以被分割成多行:

records = LOAD 'input/ncdc/micro-tab/sample.txt'

AS (year:chararray, temperature:int, quality:int);

Pig Latin有两种形式的注释。双横线是单行注释。

-- My program

DUMP A; -- What's in A?

C风格的注释更加方便,因为它使用/**/定位注释的开始和结束。

/*

* Description of my program spanning

* multiple lines.

*/

A = LOAD 'input/pig/join/A';

B = LOAD 'input/pig/join/B';

C = JOIN A BY $0, /* ignored */ B BY $1;

DUMP C;

Pig Latin 有一列关键字,这些关键字有特殊的意义,不能被用作变量名。这些包括操作符

LOADILLUSTRATE),命令(cat,ls),表达式(matchesFLATTEN),和函数(DIFFMAX),剩下的部分会介绍这些东西。

Pig Latin在大小写敏感上面有复杂的规则。操作符和命令大小写不敏感(为了使交互使用更加便捷);然而,起别名和函数的名字是大小写敏感的。

语句

Pig Latin作为可执行的程序,每一条语句都被解析。如果有语法错误,或者其它的问题,例如未定义的别名,解释器会停止运行,并显示出错误信息。解释器为每一个关系操作符建立逻辑计划,这组成了Pig Latin编程的核心。每条语句的逻辑计划都被添加到程序的逻辑计划中,然后,解释器移到下一条语句。

有个很重要的一点,你要明白,就是,当程序的逻辑计划正在构造的时候,数据处理过程是不会发生的。例如,考虑下第一个例子的Pig Latin程序:

-- max_temp.pig: Finds the maximum temperature by year

records = LOAD 'input/ncdc/micro-tab/sample.txt'

AS (year:chararray, temperature:int, quality:int);

filtered_records = FILTER records BY temperature != 9999 AND

(quality == 0 OR quality == 1 OR quality == 4 OR quality == 5 OR quality == 9);

grouped_records = GROUP filtered_records BY year;

max_temp = FOREACH grouped_records GENERATE group,

MAX(filtered_records.temperature);

DUMP max_temp;

Pig Latin 解释器见到第一行包含LOAD语句的时候,它就确认,这一行是满足语法的,并且把它添加到逻辑计划中,但是,它并不从文件中加载数据(甚至都不检查文件是否存在)。

实际上,什么时候才加载数据?加载到内存?即使数据适合加载到内存中,那么怎么处理数据呢?可能,并不是所有的数据都是需要的(因为,后面的语句会过滤掉数据)

因此,把数据加载进去是没有意义的。直到整个流程被定义完成以后,开始处理才是有意义的。相似的,Pig生效GROUPFOREACH...GENERATE语句,把它们加到逻辑计划中,但是不执行它们。Pig开始执行的触发器是DUMP语句。只有在那时,逻辑计划才被编译成物理计划,并被执行。

注:多查询的执行

因为DUMP是诊断工具,所以,它总是会触发执行。然而,STORE命令不同。在交互模式下,STOREDUMP总是会触发执行,但是,在批处理模式下,就不会这样。原因是,在批处理模式下,Pig会解析全部的脚本,以便看看有没有优化的方法,来限制从硬盘写入写出的数据的数量。看下下面简单的例子:

A = LOAD 'input/pig/multiquery/A';

B = FILTER A BY $1 == 'banana';

C = FILTER A BY $1 != 'banana';

STORE B INTO 'output/b';

STORE C INTO 'output/c';

BC都是从A中分割数据,为了节省两次读APig可以把这个脚本当作一个单独的Mapreduce job,读A一次,写出两个输出文件,一个给B,一个给C。这个特点叫做多查询执行。之前的Pig版本没有这个特点,你可以通过-M或者-no_multiquery 命令,来使用多查询执行。

Pig准备的物理计划,是一系列的Mapreduce jobs,在本地模式,Pig运行在本地虚拟机中,在Mapreduce 模式,Pig运行在Hadoop集群中。你可以使用EXPLAIN命令来查看Pig创建的逻辑和物理计划(例如,EXPLAIN max_temp)。EXPLAIN也会显示Mapreduce的计划,计划会显示出,物理操作符是怎样分组到Mapreduce jobs中的。这是一个帮助你找出,Pig会运行几个Mapreduce jobs来执行你的查询的方法。Pig中可以成为逻辑计划的关系操作符,列在了表11-1中。在351页的“数据处理符”部分,我们会详细讲解。

有其它类型的语句没有被加到逻辑计划中。例如,诊断操作符,DESCRIBEEXPLAINILLUSTRATE是被提供,来允许用户和逻辑计划交互的,这是为了debugging目的。DUMP是一种诊断操作符,因为它仅被用来,运行交互的debugging(原文,since it is used only to allow

interactive debugging of small result sets or in combination with LIMIT to retrieve a

few rows from a larger relation.STORE命令应该在输出很多的时候使用,这样输出就写到文件中了,而不是控制台。

PigLatin 提供了两个语句,REGISTERDEFFINE,这是为了,合并用户定义函数到Pig脚本中。(see Table 11-3).

因为它们不处理关系,命令不会被加到逻辑计划中;相反,它们是立刻执行。Pig提供命令来和Hadoop文件系统(在Pig处理前或后,移动数据是非常方便的)和Mapreduce,就像一些实用命令(described in Table 11-4)

文件系统命令,可以操作Hadoop文件系统中的文件或者目录。你可以使用Pigfs命令来访问所有的Hadoop文件系统shell命令。例如fs-ls会显示出一个文件列表。

这些命令,大多数是自解释的,除了set命令,set命令是用老设置控制Pig的行为的。Debug选项是用来从脚本中,打开和关闭调试日志记录的(你也可以在启动Pig的时候,控制log的等级,使用-d或者-debug选项)。

grunt> set debug on

另一个有用的选项是 job.name option,可以给Pig job一个有意义的名字,这样,当运行在一个Hadoop集群上面的时候,筛选出你的Pig Mapreduce jobs就很简单了。如果,Pig正在运行一个脚本(而不是从Grunt的交互模式),它的job名字默认值基于脚本名字。

运行Pig脚本,有两个命令,execrun。不同之处是,exec 在批处理模式下,在一个新的Grunt shell运行脚本,所以,脚本中的任何别名定义,在脚本完成之后,不可再被访问。另一方面,当使用run命令执行的时候,就像脚本的内容已经被人为的输入了一遍,因此,命令记录包括脚本的所有命令。Multiquery的执行,仅能使用exec,而不能使用run

表达式

一个表达式,就是计算出一个值。表达式可以在Pig中使用,作为包括操作符的命令的一部分。Pig有丰富的表达式,许多与其它编程语言类似。下表列出来了,简短的介绍和例子。

类型

到目前为止,你已经见到了,Pig的简单类型,例如intchararray。这里,我们会详细讨论Pig的内置类型。

Pig有四个数字类型,intlongfloatdouble,与java部分是对应的。也有bytearray类型。

Numerictextualbinary 类型是简单的原子类型。PigLatin也有三个复杂类型:tuple, bag, and map

复杂的类型,通常是从文件中加载进来的,或者使用关系运算符构造出来的。需注意,表11-6中的文字形式,是当常量由PigLatin创建的时候,才被使用。当,使用标准的PigStorge加载器的时候,文件中的行的格式,通常是不同的。例如,表格11-6中的bag文件可以是{(1,pomegranate),(2)}(注意,没有引号),有一个合适的结构,这个会被作为一个单独的字段和行加载进来,值是bag

Maps总是从文件中加载,因为Pig中没有能够生成map的关系操作符。如果愿意的话,写一个UDF来生成maps是可能的。尽管,关系和bags在概念上是一样的,在使用中,Pig对它们是有一点不同的。关系是一个高级的结构,因为,bag必须包含在关系中。通常情况下,你不必担心这个,但是有一些限制,会绊倒新手。例如,从bag中创建关系是不可能的。所以,以下的命令是错误的:

A = {(1,2),(3,4)}; -- Error

As another example, you cant treat a relation like a bag and project a field into a new

relation ($0 refers to the first field of A, using the positional notation):

B = A.$0;

Instead, you have to use a relational operator to turn the relation A into relation B:

B = FOREACH A GENERATE $0;

PigLatin后续的版本中,可能会移除这个不协调的地方,以同样的方式,对待关系和bags

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值