pig安装与使用

一. Pig简介:

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:

[plain] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. zhangsan    23  1  
  2. lisi    24  1  
  3. wangmazi    30  1  
  4. meinv   18  0  
  5. dama    55  0  

数据文件tmp_file_2:

[plain] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. 1   a  
  2. 23  bb  
  3. 50  ccc  
  4. 30  dddd  
  5. 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实例:

数据格式:

[plain] view plain copy 在CODE上查看代码片 派生到我的代码片
  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. 计算一名学生被多少位老师教过:

[plain] view plain copy 在CODE上查看代码片 派生到我的代码片
  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. 找出每位老师最优秀的两名学生:

[plain] view plain copy 在CODE上查看代码片 派生到我的代码片
  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;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值