发布于 2015-01-16 09:14:01 | 235 次阅读 | 评论: 0 | 来源: PHPERZ
Apache Pig
Apache Pig 是一个高级过程语言,是基于hadoop的处理框,适合于使用 Hadoop 和 MapReduce 平台来查询大型半结构化数据集。通过允许对分布式数据集进行类似 SQL 的查询,Pig 可以简化 Hadoop 的使用。
Apache Pig 是一个高级过程语言,是基于hadoop的处理框,适合于使用 Hadoop 和 MapReduce 平台来查询大型半结构化数据集。通过允许对分布式数据集进行类似 SQL 的查询,Pig 可以简化 Hadoop 的使用。
Pig可以看做hadoop的客户端软件,可以连接到hadoop集群进行数据分析工作。
Pig方便不熟悉Java的用户,使用一种较为简便的类似于sql的面相数据流的语言Pig latin进行数据处理。
Pig latin可以进行排序、过滤、求和、分组、关联等常用操作,还可以自定义函数,这是一种面向数据分析处理的轻量级脚本语言。
Pig可以看做是Pig latin到map-reduce的映射器。
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
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:
数据文件tmp_file_2:
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;
数据格式:
1. 计算一名学生被多少位老师教过:
计算结果:
(James,2)
(NocWei,1)
(Vincent,2)
2. 找出每位老师最优秀的两名学生: