发布于 2015-01-16 09:14:01 | 218 次阅读 | 评论: 0 | 来源: PHPERZ

这里有新鲜出炉的精品教程,程序狗速度看过来!

Apache Pig

Apache Pig 是一个高级过程语言,是基于hadoop的处理框,适合于使用 Hadoop 和 MapReduce 平台来查询大型半结构化数据集。通过允许对分布式数据集进行类似 SQL 的查询,Pig 可以简化 Hadoop 的使用。


一. Pig简介

Apache Pig 是一个高级过程语言,是基于hadoop的处理框,适合于使用 Hadoop 和 MapReduce 平台来查询大型半结构化数据集。通过允许对分布式数据集进行类似 SQL 的查询,Pig 可以简化 Hadoop 的使用。

Pig可以看做hadoop的客户端软件,可以连接到hadoop集群进行数据分析工作。

Pig方便不熟悉Java的用户,使用一种较为简便的类似于sql的面相数据流的语言Pig latin进行数据处理。

Pig latin可以进行排序、过滤、求和、分组、关联等常用操作,还可以自定义函数,这是一种面向数据分析处理的轻量级脚本语言。

Pig可以看做是Pig latin到map-reduce的映射器。

二. Pig配置

1. 下载并解压pig安装包

2. 设置环境变量,用set命令检查环境变量

export PIG_HOME=/cloud/pig
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$PIG_HOME/bin

3. 本地模式:所有文件和执行过程都在本地,一般用于测试程序

启动grunt shell: pig -x local 

4. MapReduce模式:实际工作模式

4.1) 设置PIG_CLASSPATH环境变量 

export JAVA_HOME=/usr/java
export HADOOP_HOME=/cloud/hadoop
export PIG_HOME=/cloud/pig
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$PIG_HOME/bin
export PIG_CLASSPATH=$HADOOP_HOME/conf

4.2) 启动grunt shell: pig

三. pig的三种运行方式

1. grunt shell命令:

2. 脚本方式:

脚本方式本质上是grunt shell方式中命令的集合,用脚本文件存储命令序列。一个pig脚本通常以“.pig”后缀作为pig脚本的标志。

如:script.pig

A = LOAD 'data.txt' USING PigStorage() AS (name:chararray, age:int, score:int);

B = FOREACH A GENERATE name;

DUMP B;

mapreduce模式下运行脚本文件: pig script.pig

如果script.pig文件在hadoop集群中的/wjb目录下,则需要执行如下命令:pig hdfs://hadoop001:9000/wjb/script.pig

3. 嵌入式方式

可以先编写特定的java程序,在java程序中嵌入pig命令代码,并打成jar包

运行方式:java -cp pig.jar org.apache.pig.Main script.pig

三. 各种sql在pig中实现:

数据文件tmp_file_1:

    zhangsan    23  1  
    lisi    24  1  
    wangmazi    30  1  
    meinv   18  0  
    dama    55  0 

数据文件tmp_file_2:

    1   a  
    23  bb  
    50  ccc  
    30  dddd  
    66  eeeee 

1. 从文件导入数据
    1) Mysql (Mysql需要先创建表).
    CREATE TABLE TMP_TABLE_1(USER VARCHAR(32),AGE INT,IS_MALE BOOLEAN);
    CREATE TABLE TMP_TABLE_2(AGE INT,OPTIONS VARCHAR(50));   -- 用于Join
    LOAD DATA LOCAL INFILE '/data/tmp_file_1'  INTO TABLE TMP_TABLE_1 ;
    LOAD DATA LOCAL INFILE '/data/tmp_file_2'  INTO TABLE TMP_TABLE_2;


    2) Pig
    tmp_table_1 = LOAD '/data/tmp_file_1' USING PigStorage('\t') AS (user:chararray, age:int,is_male:int);
    tmp_table_2= LOAD '/data/tmp_file_2' USING PigStorage('\t') AS (age:int,options:chararray);

2. 查询整张表
    1) Mysql
    SELECT * FROM TMP_TABLE_1;


    2) Pig
     DUMP tmp_table_1;


3. 查询前3行
    1) Mysql
    SELECT * FROM TMP_TABLE_1 LIMIT 3;


    2) Pig 
    tmp_table_limit = LIMIT tmp_table_1 3;
    DUMP tmp_table_limit; 
 

4. 查询某些列
    1) Mysql
    SELECT USER FROM TMP_TABLE_1;


    2) Pig
    tmp_table_user = FOREACH tmp_table_1 GENERATE user;
    DUMP tmp_table_user;

5. 给列取别名
    1) Mysql
    SELECT USER AS USER_NAME,AGE AS USER_AGE FROM TMP_TABLE_1;


    2) Pig
    tmp_table_column_alias = FOREACH tmp_table_1 GENERATE user AS user_name,age AS user_age;
    DUMP tmp_table_column_alias; 

6. 排序
    1) Mysql
    SELECT * FROM TMP_TABLE_1 ORDER BY AGE;


    2) Pig
    tmp_table_order = ORDER tmp_table_1 BY age ASC;
    DUMP tmp_table_order;

 7. 条件查询
    1)Mysql
    SELECT * FROM TMP_TABLE_1 WHERE AGE > 20;


    2) Pig
    tmp_table_where = FILTER tmp_table_1 by age > 20;
    DUMP tmp_table_where;

8. 内连接Inner Join
    1) Mysql
    SELECT * FROM TMP_TABLE_1 A JOIN TMP_TABLE_2 B ON A.AGE = B.AGE;


    2) Pig
    tmp_table_inner_join = JOIN tmp_table_1 BY age,tmp_table_2 BY age;
    DUMP tmp_table_inner_join;
 

9. 左连接Left  Join
    1) Mysql
    SELECT * FROM TMP_TABLE_1 A LEFT JOIN TMP_TABLE_2 B ON A.AGE = B.AGE;


    2) Pig
    tmp_table_left_join = JOIN tmp_table_1 BY age LEFT OUTER,tmp_table_2 BY age;
    DUMP tmp_table_left_join;


10. 右连接Right Join
    1) Mysql
    SELECT * FROM TMP_TABLE_1 A RIGHT JOIN TMP_TABLE_2 B ON A.AGE = B.AGE;


    2) Pig
    tmp_table_right_join = JOIN tmp_table_1 BY age RIGHT OUTER,tmp_table_2 BY age;
    DUMP tmp_table_right_join;
 

11. 全连接Full Join
    1) Mysql
    SELECT * FROM TMP_TABLE_1 A  JOIN TMP_TABLE_2 B ON A.AGE=B.AGE
    UNION SELECT * FROM TMP_TABLE_1 A LEFT JOIN TMP_TABLE_2 B ON A.AGE = B.AGE
    UNION SELECT * FROM TMP_TABLE_1 A RIGHT JOIN TMP_TABLE_2 B ON A.AGE = B.AGE;


    2) Pig
    tmp_table_full_join = JOIN tmp_table_1 BY age FULL OUTER,tmp_table_2 BY age;
    DUMP tmp_table_full_join;

12. 同时对多张表交叉查询

    1) Mysql
    SELECT * FROM TMP_TABLE_1,TMP_TABLE_2;


    2) Pig
    tmp_table_cross = CROSS tmp_table_1,tmp_table_2;
    DUMP tmp_table_cross;

13. 分组GROUP BY
    1) Mysql
    SELECT * FROM TMP_TABLE_1 GROUP BY IS_MALE;


    2) Pig
    tmp_table_group = GROUP tmp_table_1 BY is_male;
    DUMP tmp_table_group;
 

14. 分组并统计
    1) Mysql
    SELECT IS_MALE,COUNT(*) FROM TMP_TABLE_1 GROUP BY IS_MALE;


    2) Pig
    tmp_table_group_count = GROUP tmp_table_1 BY is_male;
    tmp_table_group_count = FOREACH tmp_table_group_count GENERATE group,COUNT($1);
    DUMP tmp_table_group_count;
 

15. 查询去重DISTINCT
    1) MYSQL
    SELECT DISTINCT IS_MALE FROM TMP_TABLE_1;


    2) Pig
    tmp_table_distinct = FOREACH tmp_table_1 GENERATE is_male;
    tmp_table_distinct = DISTINCT tmp_table_distinct;
    DUMP tmp_table_distinct;

四. Pig Latin实例:

数据格式:

  1. James,Network,Tiger,100  
  2. James,Database,Tiger,99  
  3. James,PDE,Yao,95  
  4. Vincent,Network,Tiger,95  
  5. Vincent,PDE,Yao,98  
  6. NocWei,PDE,Yao,100  

1. 计算一名学生被多少位老师教过:

  1. A = LOAD 'score.txt' USING PigStorage(',') AS (student, course, teacher, score:int);  
  2. B = FOREACH A GENERATE student, teacher;  
  3. C = DISTINCT B;  
  4. D = FOREACH (GROUP C BY student) GENERATE group AS student, COUNT(C);  
  5. DUMP D;  

计算结果:

(James,2)
(NocWei,1)
(Vincent,2)

2. 找出每位老师最优秀的两名学生:

  1. A = LOAD 'score.txt' USING PigStorage(',') AS (student, course, teacher, score:int);  
  2. B = FOREACH A GENERATE student, course, score;  
  3. C = GROUP B BY course;  
  4. D = FOREACH C {sorted = ORDER B BY score DESC; top = LIMIT sorted 2; GENERATE group AS course, top AS top;}  
  5. E = FOREACH D GENERATE course, FLATTEN(top);  
  6. DUMP E;  


最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务