pig使用

可以作为一个随身参考

1、更简单的挖掘大规模数据集而发明。
 可使用用户定义语言UDF进行修改
 运行pig脚本 pig script.pig
 grunt自动补全机制 tab键 创建autocomplete文件,常用单词或文件路径 quit退出
2、示例 计算年度最高气温 --表示注释
 1)records = LOAD '外部文件' as      --制表符分割(year:chararray,temperatrue:int,quality:int);
 2)filtered_records = filter records by temperatur !=9999 and (quanlity==0 or quanlity==1 or quanlity==2);
 3)grouped_records = group filter_records by year;
 4)max_temp = foreach grouped_records generate group,max(filtered_records.temperature);
 5)dump max_temp;
3、创建一个精简的数据集是一门艺术。illustrate 利用pig生成一个精简数据集。
4、query planner
5、pig/hive 都被设计为使用hdfs作为存储。hive的查询语言是基于HiveQL,是基于SQL的,要求所有数据都必须存储在表中。都不支持低延迟查询。
一个pig latin 程序是you一组语句构成,一个语句可理解为we一个操作或一个命令。group操作 grouped_records = group records by year;
分号结束语句。
records = load '外部文件' as (year:chararray,temperature:int,quality:int);
--单行注释。
dump A; --whats in A?
/*
这种注释可以跨越多行。
*/
在整个程序逻辑计划没有构造完成前,pig并不处理数据。
在交互模式下,store和dump一样,总会触发语句的执行(包括run命令)。但是,在批处理模式下,不会触发执行(包含exec命令)。在批处理模式下,pig会解析整个脚本。
加载与存储:
 load 将数据从文件系统或其他存储中加载数据,存入关系。
 store 将一个关系存放到文件系统或其他存储中。
 dump 将关系打印到控制台
过滤
 filter ... by 从关系中删除不需要的行
 distinct 从关系中删除重复的行
 foreach ...generate 从关系中增加或删除字段
 stream 使用外部程序对关系进行变换
 sample 从关系中随机取样
分组与连接 
 join 连接两个或多个关系
 cogroup 在两个货更多关系中对数据进行分组
 group 在一个关系中对数据进行分组
 cross 取得两个货更多关系的乘机(叉技)
排序
 order 根据一个或多个字段对某个关系进行排序
 limit 将关系元组个数限定在一定数量内。
合并与分割
 union 合并两个或多个关系
 split 把某个关系切分两个或多个关系

诊断操作
 describe 打印关系的模式
 /explain 打印逻辑和物理计划
 /illustrate 使用生成的输入子集显示逻辑计划的试运行结果
使用UDF
 register 在pig运行时环境中注册一个jar文件
 define 为udf,流式脚本或命令规范新建别名
pig表达式
 
dump

-------------------------------------------
pig -e 'cmd'
pig -f script.pig
pig -x local|mapreduce 默认mapreduce
------------------
a = load '/input' using PigStorage('\t') as (sname:chararray,age:int);
b = foreach a generate sname;
dump b;
store b into '/out'
student文件内容:
1:zhangsan:boy:12:compute
3:lisi:boy:32:math
2:xiaoli:girl:23:meishu
/*多行注释*/
A = load '/input' using PigStorage(':') as --单行注释(sno:chararray,sname:chararray,ssex:chararray,sage:int,sdept:chararray);
B = foreach A generate sname,sdept;
dump B;
存储为一个文件test.pig,通过pig -f test.pig运行脚本
store B into '/out' using PigStorage('\t');

describe alias;
explain alias;
illustrate alis;
-------------
A = load '/input/data' using PigStorage() as (f1:int,f2:int,f3:int);
B = group A by f1;
C = foreach B generate count($0);--count不支持,提示无法解析,generate $0替换
dump c;
S = filter A by f2 matches '32.+'; -- 只有f2为chararray类型的时候才可以使用matches
V = filter A by f1==2;--若f1为数值类型,则可以通过比较运算符实现
X = group V by f1; --分组 $0为第一个字段(代表分组的字段)

用户定义函数
-- 字母大写
package pig;

import java.io.IOException;

import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;

public class UPPER extends EvalFunc<String>{

 @Override
 public String exec(Tuple tuple) throws IOException {
  // TODO Auto-generated method stub
  if(tuple == null || tuple.size() == 0)
   return null;
  try {
   return tuple.get(0).toString().toUpperCase();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   return null;
  }
 }

}

打包放在pig的lib目录下;
如果没有放在路径下 register 你的jar存放的位置,进行注册
A = load '/input/student' using PigStorage(':') as (sno:chararray,sname:chararray,ssex:chararray,sage:int,sdept:chararray);
B = foreach A generate pig.UPPER(ssex);
dump B;

如果运行在local模式下进行测试
pig -x local -f test.pig --前提将数据准备好在相应的目录


-- 测试
数据student:
1:zhangsan:boy:12:compute
3:lisi:boy:32:math
2:xiaoli:girl:23:meish
获取他们的姓名和年龄
A = load 'student' using PigStorage(':') as (sno:chararray,sname:chararray,ssex:chararray,sage:int,sdept:chararray);
B = foreach A generate sname,sage;
dump B;

-- mapreduce模式
package pig;

import org.apache.pig.PigServer;

public class TaskMR {

 public static void main(String[] args) throws Exception {
  PigServer server = new PigServer("local");
  runQuery(server, "c:/student");
 }
 public static void runQuery(PigServer server,String inputFile) throws Exception{
  String A = "A = load '"+inputFile+"' using PigStorage(':') as (sno:chararray,sname:chararray,ssex:chararray,sage:int,sdept:chararray);";
  System.out.println(A);
  server.registerQuery(A);
  server.registerQuery("B = foreach A generate sname,sage;");
  server.store("B", "/B");
 }
}
始终提示一个异常:无论是在本地或mapreduce下
Exception in thread "main" java.lang.NoSuchFieldError: name
在eclipse里面运行的。

posted @ 2014-07-28 11:36  jseven  阅读(709)  评论(0编辑  收藏  举报