14.3.4 Pig Latin关键字
Pig Latin语言有很多关键字,但是我们不可能一一给大家介绍。在下面的第一部分的内容中,我们给大家介绍Pig Latin语言都包含哪些关键字;然后在第二部分,我们就其中主要的关键字给大家做详细介绍。
1.Pig Latin关键字
表14-2给出了一些与首字母相对应的关键字。
2.常用关键字
在Pig Latin常用的关键字中,我们将其分为四类:关系运算符、诊断运算符、Load/Store函数和文件命令。
(1)关系运算符
Load
它的作用是从文件系统中加载数据,语法如下:
LOAD'data'[USING function][AS schema]
在这里“data”表示文件或目录的名字,并且要用单引号括起来。如果用户指定一个目录的名字,目录中所有的文件将被加载。中括号中的内容为可选项(如果没有特殊指明,“[]”都表示可选项),用户只在需要的时候指明,可以省略。这里使用schema来指定加载数据类型,如果数据类型与模式中指定的数据类型不符,那么系统将产生一个null,甚至会报错。
下面是我们给出的几个Load操作的例子:
不使用任何方式:
A=LOAD'myfile.txt';
使用加载函数:
A=LOAD'myfile.txt'USING PigStorage('\t');
指定模式:
A=LOAD'myfile.txt'AS(f1:int, f2:int, f3:int);
加载函数和模式均使用:
A=LOAD'myfile.txt'USING PigStorage('\t')AS(f1:int, f2:int, f3:int);
Store
它的作用是将结果保存到文件系统中,语法如下所示:
STORE alias INTO'directory'[USING function];
这里的“alias”是用户要存储的结果(关系)的名称,INTO为不可省略的关键字,Directory为用户指定的存储目录的名字,需要用单引号括起来。另外,如果此目录已经存在,那么Store操作将会失败,输出文件将被系统命名成part-nnnnn的格式。
Foreach
它的作用是基于数据的列进行数据转换,语法如下:
alias=FOREACH{gen_blk|nested_gen_blk}[AS schema];
通常我们使用“FOREACH……GENERATE”组合来对数据列进行操作,下面是两个简单的例子。
如果一个关系A(outer bag),FOREACH语句可以按下面的方式来使用:
X=FOREACH A GENERATE f1;
如果A是一个inner bag, FOREACH语句可以按下面的方式来使用:
X=FOREACH B{
S=FILTER A BY'xyz';
GENERATE COUNT(S.$0);
}
对于初级用户来说,仅需要掌握第一种操作方式,关于Foreach关键字的更多内容我们将在今后进行详细的讨论。
(2)诊断运算符
Dump
它的作用是将结果显示到屏幕上,语法如下:
DUMP alias
这里的“alias”为被操作关系的名字。
使用DUMP操作符来执行Pig Latin语句,并且把结果输出到屏幕上。使用DUMP意味着使用交互式模式,也就是说,语句被马上执行,但结果并没有被保存。用户可以使用DUMP作为一个调试设备,用来检查用户期望的数据是否已经生成。另外用户应该有选择地使用DUMP,因为它会使多值查询优化无效,并且可能会减慢执行。
示例:
A=LOAD'student'AS(name:chararray, age:int, gpa:float);
DUMP A;
这里Pig将会把A中所有的数据输出到屏幕上。
Describe
它的作用是返回一个名称的模式,语法如下:
DESCRIBE alias;
使用DESCRIBE操作符来查看指定名称的模式。
在这个例子中,使用AS子句来指定一个模式,如果所有的数据都符合这个模式,Pig将使用已分配的类型。然后我们使用DESCRIBE操作符来查看它们的模式。
A=LOAD'student'AS(name:chararray, age:int, gpa:float);
B=FILTER A BY name matches'J.+';
C=GROUP B BY name;
D=FOREACH B GENERATE COUNT(B.age);
DESCRIBE A;
A:{group, B:(name:chararray, age:int, gpa:float}
DESCRIBE B;
B:{group, B:(name:chararray, age:int, gpa:float}
DESCRIBE C;
C:{group, chararry, B:(name:chararray, age:int, gpa:float}
DESCRIBE D;
D:{long}
(3)Load/Store函数
PigStorage的作用是加载、存储UTF-8格式的数据,语法如下:
PigStorage(field_delimiter)
Field_delimiter为PigStorage函数的参数,用来指定函数的字段定界符。PigStorage函数默认的字段定界符为:tab('\t'),用户也可以指定其他字段定界符,但定界符要在单引号中指明。
PigStorage是LOAD和STORE操作符默认的加载函数,而且能够处理简单的和复杂的数据类型。
PigStorage对有结构的文本进行读取,并采用UTF-8编码进行存储。
在Load语句中,PigStorage希望数据使用域定界符进行格式化。默认情况下为字符('\t'),用户也可以指定其他的字符。
在Store语句中,PigStorage同样使用域定界符来输出数据。它的操作方法和Load语句相同,另外Store语句的记录定界符使用('\n')。
Load或Store语句的默认的域定界符均为tab('\t')。用户可以使用其他字符作为字段定界符。但是像^A或Ctrl-A等字符应使用UTF-16编码格式进行编码。
Load语句中,Pig注明记录定界符为:换行符('\n')、回车返回符('\r')或CTRL-M以及组合的CR+LF字符('\r\n')[1]。在Store语句中,Pig使用换行符作为记录定界符。
以下提供一个示例。
在这个例子中PigStorage使用tab作为域定界符,换行符为记录定界符,并且下面的两条语句是等价的:
A=LOAD'student'USING PigStorage('\t')AS(name:chararray, age:int, gpa:float);
A=LOAD'student'AS(name:chararray, age:int, gpa:float);
在这个例子中,PigStorage将X的内容存储到文件中,并且使用星号作为域定界符。STORE函数将结果存储在output目录中。
STORE X INTO'output'USING PigStorage('*');
(4)文件命令:
cd
它的作用是将当前目录修改为其他目录,语法如下:
cd[dir]
此处的cd命令和Linux的cd命令非常相似,能够用来对文件系统进行定位。如果用户指定了一个目录,那么这个目录将成为用户当前的工作目录,并且用户所有其他的操作都将相对于这个目录来进行。如果没有指定任何目录,用户的根目录将成为当前的工作目录。
copyFromLocal
它的作用是从本地文件系统复制文件或目录到HDFS中,语法如下:
copyFromLocal src_path dst_path
其中,src_path为本地系统中的文件或目录的路径,dst_path为HDFS系统中的路径。
CopyFromLocal命令让用户能够从本地文件系统中复制文件或目录到Hadoop的分布式文件系统中。
ls
它的作用是显示一个目录中的内容,语法如下:
ls[path]
此处的ls命令和Linux中的ls命令相似,如果指定一个目录,这个命令将列出被指定目录中的内容。如果不指定参数,那么系统将列出当前工作目录中的内容。
rm
它的作用是移除一个或更多的文件或目录,语法如下:
rm path[path……]
此处的rm命令和Linux中的rm命令相似,让用户能够移除一个或多个文件或目录。
[1]一定不要将这些字符用作域定界符。