Apache Pig是一个用于分析大型数据集的平台,其中包括用于表达数据分析程序的高级语言,以及用于评估这些程序的基础结构。 Pig程序的显着特性是它们的结构适于大量并行化,这反过来使得它们能够处理非常大的数据集。

目前,Pig的基础结构层由一个编译器组成,该编译器产生Map-Reduce程序的序列,已经存在大规模并行实现(例如Hadoop子项目)。 Pig的语言层目前由一种称为Pig Latin的文本语言组成,它具有以下主要属性:

易于编程:

实现简单的,“尴尬并行的”数据分析任务的并行执行是微不足道的。由多个相关数据变换组成的复杂任务被显式编码为数据流序列,使其易于编写,理解和维护。

优化机会:

任务编码的方式允许系统自动优化其执行,允许用户专注于语义而不是效率。

可扩展性:

用户可以创建自己的功能来做特殊用途的处理。

下面是我的理解:Apache Pig 是一个高级过程语言,适合于使用 Hadoop 和 MapReduce 平台来查询大型半结构化数据集(简而言之就是查询并分析数据)。通过允许对分布式数据集进行类似 SQL 的查询,Pig 可以简化 Hadoop 的使用。

基本操作

本地/hadoop启动: 

$ pig -x local

$ pig -x hadoop

–

脚本文件方式

$ pig -x mapreduce **.pig

这是**.pig文件

messages = LOAD 'messages'; 

warns = FILTER messages BY $0 MATCHES '.*WARN+.*'; 

STORE warns INTO 'warnings';

说明一下:启动前,先启动hadoop (./hdfs-dfs.sh)

$ pig 

2011-12-10 06:39:44,276 [main] INFO org.apache.pig.Main - Logging error messages to... 2011-12-10 06:39:44,601 [main] INFO org.apache.pig.... Connecting to hadoop file \ system at: hdfs://0.0.0.0:8020 2011-12-10 06:39:44,988 [main] INFO org.apache.pig.... connecting to map-reduce \ job tracker at: 0.0.0.0:8021 

grunt> cd hdfs:/// 

grunt> ls hdfs://0.0.0.0/tmp <dir> 

hdfs://0.0.0.0/user <dir>

hdfs://0.0.0.0/var <dir> 

grunt>

Pig Latin 基本数据类型

  • 标量: double float long int
  • 数组: chararray(UTF-8) bytearray
  • 复杂类型:tuple(有序字段集) bag(元集合) map(键值对集合)

Pig Latin常用关键字

运算符

描述

FILTER

基于某个条件从关系中选择一组元组。

FOREACH

对某个关系的元组进行迭代,生成一个数据转换。

GROUP

将数据分组为一个或多个关系。

JOIN

联接两个或两个以上的关系(内部或外部联接)

LOAD

从文件系统加载数据

ORDER

根据一个或多个字段对关系进行排序。

SPLIT

将一个关系划分为两个或两个以上的关系。

STORE

在文件系统中存储数据。

示例:

用Hadoop examples jar计算pi报错 hadoop中pig_hadoop

Pig 实例

新建一个学生表(学号,姓名,性别,年龄,所在系)文件student.txt放在/home/tengxing/tmp/下,通过不同方式取出姓名和年龄字段。

201000101:李勇:男:20:计算机软件与理论 

201000102:王丽:女:19:计算机软件与理论 

201000103:刘花:女:18:计算机应用技术

201000104:李肖:男:19:计算机系统结构 

201000105:吴达:男:19:计算机系统结构 

201000106:滑可:男:19:计算机系统结构

对应的数据类型:

Student(sno:chararray, sname:chararray, ssex:chararray, sage:int, sdept:chararray)

李勇 20 

王丽 19 

刘花 18 

李肖 19 

吴达 19 

滑可 19

Local模式

shell方式
grunt> 

grunt> A =load '/home/tengxing/tmp/pig/student/test.txt' using PigStorage(':') as (sno:chararray, sname:chararray, ssex:chararray, sage:int, sdept:chararray);

grunt> B = foreach A generate sname, sage;

grunt> store B '/home/tengxing/tmp/pig/student/out';

grunt> dump B;

.....

e.util.MapRedUtil - Total input paths to process :1

(李勇,20)

(王丽,19)

(刘花,18)

(李肖,19) 

(吴达,19)

(滑可,19) 

grunt>\qhi
脚本模式

创建脚本script.pig

A =load '/home/tengxing/tmp/pig/student/test.txt' using PigStorage(':') as (sno:chararray, sname:chararray, ssex:chararray, sage:int, sdept:chararray);

B = foreach A generate sname, sage;
嵌入式程序
public class PigLocal {

public static void main(String[] args) {

try {

PigServer server = new PigServer("local"); //Local模式 

//PigServer server = new PigServer("mapreduce"); //MapReduce模式 run(server);

} catch (Exception e) {

e.printStackTrace();

}

}

private static void run(PigServer server) throws IOException{ 

server.registerQuery("A = load '/home/tengxing/tmp/pig/student/test.txt' using PigStorage(':')" + " as (sno:chararray, sname:chararray, ssex:chararray, sage:int, sdept:chararray);");

server.registerQuery("B = foreach A generate sname, sage;");

server.store("B", "/home/tengxing/tmp/pig/student/");///home/tengxing/tmp/pig/student/存在要先删除,不然执行会报异常。

}

}

MapReduce模式

把文件放进HDFS文件系统中,启动start-hdfs..sh