在这里贴一个pig源码的分析,做pig很长时间没做笔记,不包含任何细节,以后有机会再说吧

http://blackproof.iteye.com/blog/1769219

hadoop pig入门总结

  • pig简介
  • pig数据类型
  • pig latin语法
  • pig udf自定义
  • pig derived衍生
  • 推荐书籍 programming pig
  • 推荐网站 http://pig.apache.org/docs/r0.10.0/basic.html

pig简介

pig是hadoop上层的衍生架构,与hive类似。对比hive(hive类似sql,是一种声明式的语言),pig是一种过程语言,类似于存储过程一步一步得进行数据转化。

pig数据类型

  • double > float > long > int > bytearray
  • tuple|bag|map|chararray > bytearray

double float long int chararray bytearray都相当于pig的基本类型

tuple相当于数组 ,但是可以类型不一,举例('dirkzhang','dallas',41)

Bag相当于tuple的一个集合,举例{('dirk',41),('kedde',2),('terre',31)},在group的时候会生成bag

Map相当于哈希表,key为chararray,value为任意类型,例如['name'#dirk,'age'#36,'num'#41

nulls 表示的不只是数据不存在,他更表示数据是unkown

pig latin语法

1:load

LOAD 'data' [USING function] [AS schema];

例如:

load = LOAD 'sql://{SELECT MONTH_ID,DAY_ID,PROV_ID FROM zb_d_bidwmb05009_010}'    USING com.xxxx.dataplatform.bbdp.geniuspig.VerticaLoader('oracle','192.168.6.5','dev','1522','vbap','vbap','1') AS (MONTH_ID:chararray,DAY_ID:chararray,PROV_ID:chararray);

Table = load ‘url’ as (id,name…..);    //table和load之间除了等号外 还必须有个空格 不然会出错,url一定要带引号,且只能是单引号。

2:filter

alias = FILTER alias BY expression;

Table = filter Table1 by + A; //A可以是 id > 10;not name matches ‘’,is not null 等,可以用and  和or连接各条件

例如:

filter = filter load20 by ( MONTH_ID == '1210' and  DAY_ID == '18' and  PROV_ID == '010' );

3:group

alias = GROUP alias { ALL | BY expression} [, alias ALL | BY expression …] [USING 'collected' | 'merge'] [PARTITION BY partitioner] [PARALLEL n];

pig的分组,不仅是数据上的分组,在数据的schema形式上也进行分组为groupcolumn:bag

Table3 = group Table2 by id;也可以Table3 = group Table2 by (id,name);括号必须加

可以使用ALL实现对所有字段的分组

4:foreach

alias = FOREACH alias GENERATE expression [AS schema] [expression [AS schema]….];

alias = FOREACH nested_alias {

alias = {nested_op | nested_exp}; [{alias = {nested_op | nested_exp}; …]

GENERATE expression [AS schema] [expression [AS schema]….]

};

一般跟generate一块使用

Table = foreach Table generate (id,name);括号可加可不加。

avg = foreach Table generate group, AVG(age);  MAX ,MIN..

在进行数据过滤时,建议尽早使用foreach generate将多余的数据过滤掉,减少数据交换

5:join

Inner  join Syntax

alias = JOIN alias BY {expression|'('expression [, expression …]')'} (, alias BY {expression|'('expression [, expression …]')'} …) [USING 'replicated' | 'skewed' | 'merge' | 'merge-sparse'] [PARTITION BY partitioner] [PARALLEL n];

Outer join Syntax

alias = JOIN left-alias BY left-alias-column [LEFT|RIGHT|FULL] [OUTER], right-alias BY right-alias-column [USING 'replicated' | 'skewed' | 'merge'] [PARTITION BY partitioner] [PARALLEL n];

     join/left join / right join

daily = load 'A' as (id,name, sex);

divs  = load 'B' as (id,name, sex);

join

jnd   = join daily by (id, name), divs by (id, name);

left join

jnd   = join daily by (id, name) left outer, divs by (id, name);

也可以同时多个变量,但只用于inner join

A = load 'input1' as (x, y);

B = load 'input2' as (u, v);

C = load 'input3' as (e, f);

alpha = join A by x, B by u, C by e;

6: union

alias = UNION [ONSCHEMA] alias, alias [, alias …];

union 相当与sql中的union,但与sql不通的是pig中的union可以针对两个不同模式的变量:如果两个变量模式相同,那么union后的变量模式与 变量的模式一样;如果一个变量的模式可以由另一各变量的模式强制类型转换,那么union后的变量模式与转换后的变量模式相同;否则,union后的变量 没有模式。

A = load 'input1' as (x:int, y:float);

B = load 'input2' as (x:int, y:float);

C = union A, B;

describe C;

C: {x: int,y: float}

A = load 'input1' as (x:double, y:float);

B = load 'input2' as (x:int, y:double);

C = union A, B;

describe C;

C: {x: double,y: double}

A = load 'input1' as (x:int, y:float);

B = load 'input2' as (x:int, y:chararray);

C = union A, B;

describe C;

Schema for C unknown.

注意:在pig 1.0中 执行不了最后一种union。

如果需要对两个具有不通列名的变量union的话,可以使用onschema关键字

A = load 'input1' as (w: chararray, x:int, y:float);

B = load 'input2' as (x:int, y:double, z:chararray);

C = union onschema A, B;

describe C;

C: {w: chararray,x: int,y: double,z: chararray}

join和union之后alias的别名会变

7:Dump

dump alias

用于在屏幕上显示数据。

8:Order by

alias = ORDER alias BY { * [ASC|DESC] | field_alias [ASC|DESC] [, field_alias [ASC|DESC] …] } [PARALLEL n];

A = order Table by id desc;

9:distinct

A = distinct alias;

10:limit

A = limit alias 10;

11:sample

SAMPLE alias size;

随机抽取指定比例(0到1)的数据。

some = sample divs 0.1;

13:cross

alias = CROSS alias, alias [, alias …] [PARTITION BY partitioner] [PARALLEL n];

将多个数据集中的数据按照字段名进行同值组合,形成笛卡尔积。

--cross.pig

daily = load 'NYSE_daily' as (exchange:chararray, symbol:chararray,date:chararray, open:float, high:float, low:float,

close:float, volume:int, adj_close:float);

divs = load 'NYSE_dividends' as (exchange:chararray, symbol:chararray,date:chararray, dividends:float);

tonsodata = cross daily, divs parallel 10;

15:split

Syntax

SPLIT alias INTO alias IF expression, alias IF expression [, alias IF expression …] [, alias OTHERWISE];

A = LOAD 'data' AS (f1:int,f2:int,f3:int);

DUMP A;

(1,2,3)

(4,5,6)

(7,8,9)

SPLIT A INTO X IF f1<7, Y IF f2==5, Z IF (f3<6 OR f3>6);

DUMP X;

(1,2,3)

(4,5,6)

DUMP Y;

(4,5,6)

DUMP Z;

(1,2,3)

(7,8,9)

16:store

Store  … into … Using…

pig在别名维护上:

1、join

如e = join d by name,b by name;

g = foreach e generate $0 as one:chararray, $1 as two:int, $2 as      three:chararray,$3 asfour:int;

他生成的schemal:

e: {d::name: chararray,d::position: int,b::name: chararray,b::age: int}

g: {one: chararray,two: int,three: chararray,four: int}

2、group

B = GROUP A BY age;

----------------------------------------------------------------------
| B | group: int | A: bag({name: chararray,age: int,gpa: float}) |
----------------------------------------------------------------------
| | 18 | {(John, 18, 4.0), (Joe, 18, 3.8)} |
| | 20 | {(Bill, 20, 3.9)} |
----------------------------------------------------------------------

(18,{(John,18,4.0F),(Joe,18,3.8F)})

pig udf自定义

pig支持嵌入user defined function,一个简单的udf 继承于evalFunc,通常用在filter,foreach中

  1. public class MyUDF extends EvalFunc<String> {
  2. @Override
  3. public String exec(Tuple input) throws IOException {
  4. if(input == null || input.size() ==0)
  5. return null;
  6. try {
  7. String val = (String) input.get(0);
  8. return new StringBuffer(val).append(" pig").toString();
  9. } catch (Exception e) {
  10. throw new IOException(e.getMessage());
  11. }
  12. }
  13. }

pig支持udf in loader and store

udf loader 需要继承于LoadFunc

udf storer 需要继承于StoreFunc

这类似于hadoop中写inputformat和outputformat

其中vertica就是写了一个DB版本的

这里贴一个简单的loader的例子:

  1. public class MyLoader extends LoadFunc{
  2. protected RecordReader recordReader = null;
  3. private PreparedStatement ps;
  4. private Connection conn;
  5. private final String jdbcURL;
  6. private final String user;
  7. private final String pwd;
  8. private final String querySql;
  9. private ResultSet rs;
  10. public MyLoader(String driver,String jdbcURL,String user,String pwd,String querySql){
  11. try {
  12. Class.forName(driver);
  13. } catch (Exception e) {
  14. // TODO: handle exception
  15. }
  16. this.jdbcURL = jdbcURL;
  17. this.user = user;
  18. this.pwd = pwd;
  19. this.querySql = querySql;
  20. }
  21. @Override
  22. public InputFormat getInputFormat() throws IOException {
  23. return new PigTextInputFormat();
  24. }
  25. @Override
  26. public Tuple getNext() throws IOException {
  27. // TODO 重要的读取过程
  28. Text val = null;
  29. boolean next = false;
  30. try {
  31. next = rs.next();
  32. } catch (Exception e) {
  33. // TODO: handle exception
  34. }
  35. if(!next)
  36. return null;
  37. ResultSetMetaData rsmd;
  38. try {
  39. //          rsmd = result
  40. } catch (Exception e) {
  41. // TODO: handle exception
  42. }
  43. return null;
  44. }
  45. @Override
  46. public void prepareToRead(RecordReader arg0, PigSplit arg1)
  47. throws IOException {
  48. this.recordReader = arg0;
  49. }
  50. @Override
  51. public void setLocation(String arg0, Job arg1) throws IOException {
  52. //no idea
  53. }
  54. public ResourceSchema getSchema(String location,Job job) throws IOException{
  55. Configuration conf = job.getConfiguration();
  56. Schema schema = new Schema();
  57. try {
  58. //TODO:reader from database table
  59. //          Connection conn = DriverManager.getConnection(this.jdbcURL, this.user, this.pwd);
  60. FieldSchema fieldName = new FieldSchema("name", DataType.CHARARRAY);
  61. FieldSchema fieldPosition = new FieldSchema("position", DataType.INTEGER);
  62. schema.add(fieldName);
  63. schema.add(fieldPosition);
  64. } catch (Exception e) {
  65. //TODO log exception
  66. }
  67. return null;
  68. }
  69. public void prepareToRead(){
  70. }
  71. }

其中getNext方法就是如何处理reader读取出的数据

getSchema可以固定读取数据的schema

setLocation可以处理输入的数据源

prepareToRead是读取数据之前,可以在此做标识,等等

pig 衍生

1.penny:

1. Penny的描述

Penny是pig的贡献项目,是pig的调试和监控工具,而且支持根据API自定义penny的监视器和协作器,已实现不同的功能;

2. Penny的总架构

Penny将监视器插入到pig的工作操作中,主要用于监视pig数据流的变化,监视器可以调用协作器,完成各种功能。

3. Penny的总类图关系

ParsePigScript负责根据用户监视器生成新计划newPlan,在ToolsPigServer中根据以前的脚本执行新计划。在执行新计划时,当监视器监视对象数据发生变化,出发监视器,运行自定义的业务,也可以将数据流变化传回协作器里处理,总类图如下:

4. Penny的使用

Penny的使用需要自定义两个类,一个类继承于监视器基类MonitorAgent,另一个继承于协作器基类Coordinator。然后根据上边类图,就可以使用PennyServer和ParsePigScript进行监控和调试

5.在pig中就可以找到penny这个贡献的源码

Vertica:

vertica是pig loader和storer的udf

附件里是vertica,来自github,和vertica的介绍使用文档

贴一篇将vertica的帖子 http://blackproof.iteye.com/blog/1791995

  推荐书籍

programming pig

  推荐网址

http://pig.apache.org/docs/r0.10.0/basic.html 官网

pig pen开发工具,这个我现在玩得还不熟,就不介绍了,有兴趣的可以去搜搜玩玩

我在工作中pig的使用,主要是数据的ETL,所以比较适合。在选择pig hive还是其他非hadoop架构,如redis,这还是一个需要继续尝试探索的问题。

hadoop pig入门总结的更多相关文章

  1. Hadoop:pig 安装及入门示例

    pig是hadoop的一个子项目,用于简化MapReduce的开发工作,可以用更人性化的脚本方式分析数据. 一.安装 a) 下载 从官网http://pig.apache.org下载最新版本(目前是0 ...

  2. 1.2 Hadoop快速入门

    1.2 Hadoop快速入门 1.Hadoop简介 Hadoop是一个开源的分布式计算平台. 提供功能:利用服务器集群,根据用户定义的业务逻辑,对海量数据的存储(HDFS)和分析计算(MapReduc ...

  3. Hadoop快速入门

    目的 这篇文档的目的是帮助你快速完成单机上的Hadoop安装与使用以便你对Hadoop分布式文件系统(HDFS)和Map-Reduce框架有所体会,比如在HDFS上运行示例程序或简单作业等. 先决条件 ...

  4. Hadoop高速入门

    Hadoop高速入门 先决条件 支持平台 GNU/Linux是产品开发和执行的平台. Hadoop已在有2000个节点的GNU/Linux主机组成的集群系统上得到验证. Win32平台是作为开发平台支 ...

  5. 详细的Hadoop的入门教程-完全分布模式Fully-Distributed Operation

    1. 前面在伪分布模式下已经创建了一台机器,为了统一命名,hostname更名为hadoop01.然后再克隆2台机器:hadoop02. hadoop03:将第一台机器hadoop01上的伪分布停止, ...

  6. hadoop家族之pig入门

    昨天成功运行第一个在hadoop集群上面的python版本的wordcount,今天白天继续看网上提供的文档.下午上头给定的回复是把hadoop家族都熟悉一下,那就恭敬不如从命,开始学习pig吧- 这 ...

  7. Apache Pig入门学习文档(一)

    1,Pig的安装    (一)软件要求    (二)下载Pig      (三)编译Pig 2,运行Pig    (一)Pig的所有执行模式    (二)pig的交互式模式    (三)使用pig脚本 ...

  8. Hadoop Pig简介、安装、试用

    相比Java的MapReduce api,Pig为大型数据集的处理提供了更高层次的抽象,与MapReduce相比,Pig提供了更丰富的数据结构,一般都是多值和嵌套的数据结构.Pig还提供了一套更强大的 ...

  9. Hadoop大数据学习视频教程 大数据hadoop运维之hadoop快速入门视频课程

    Hadoop是一个能够对大量数据进行分布式处理的软件框架. Hadoop 以一种可靠.高效.可伸缩的方式进行数据处理适用人群有一定Java基础的学生或工作者课程简介 Hadoop是一个能够对大量数据进 ...

随机推荐

  1. android弹出dialog后,activity得到焦点

    1.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,WindowManager.LayoutParams.FLAG ...

  2. 压测软件-Tsung.安装篇

    author :James,jimingsong@vip.qq.com author :James,jimingsong@vip.qq.com since :2015-03-02 tsung介绍 ts ...

  3. Regmon7.04绿色版(注册表变动实时监视工具)

    Regmon V7.04 简繁中文绿色版 软件大小: 155KB软件语言: 简体中文运行环境:Win9x/NT/2000/XP/2003/软件类别:国外软件 / 免费版 / 系统其它Regmon Re ...

  4. 搭建gitbook环境

    1.官网下载安装nodejs,安装完成后使用终端输入node -v,用cmd命令窗口查看是否安装成功:如下图所示: 2.在cmd命令窗口中输入:npm install -g cnpm -registr ...

  5. 高一的我曾对自己说"要放慢脚步去生活"!?

    看了高一的时候自己写的日记,瞬间被自己感动到了.以下是当时的几段感慨: 慢是一种放松.是生活的一种良好心态,喜欢这样放慢步伐地生活,那是一种享受! 但我们生活在一个快节奏的时代,我们总是被迫卷进那潮流 ...

  6. some links

    rename user: http://www.cyberciti.biz/faq/howto-change-rename-user-name-id/

  7. VMware安装Centos6.8设置ip无法远程连接问题

    今天使用VMware安装Centos6.8minimal版本再设置ip地址的时候遇到了一些麻烦,就是无法ping通Centos操作系统的配置的ip从而无法用Xshell远程连接上. 如何配置请看下面的 ...

  8. Asp.Net MVC2.0 Url 路由入门---实例篇

    本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的Vi ...

  9. 网站生产app的一些网址

    1.http://www.staticgen.com/2.http://siteapp.baidu.com3.http://www.apicloud.com

  10. ZOJ 2710 Two Pipelines

    计算几何+贪心 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm&g ...