Apache Pig是MapReduce的一个抽象。它是一个工具/平台,用于分析较大的数据集,并将它们表示为数据流。
它使用Pig Latin编程语言来写脚本,和 Hive 有一些相似之处。这里简单做一下总结
1、加载数据
A = LOAD 'a.txt' AS (col1:chararray, col2:int, col3:int, col4:int, col5:double, col6:double);
这里将文本文件 a.txt 加载到 A 里,其中该文件包含6列
2、存储数据
STORE alias INTO 'directory' USING function;
使用load关键字将数据载入到关系 student
student = LOAD 'hdfs://localhost:9000/pig_data/student_data.txt'
USING PigStorage(',')
as ( id:int, firstname:chararray, lastname:chararray, phone:chararray, city:chararray );
然后将关系存储在HDFS目录“/pig_Output/"中
STORE student INTO ' hdfs://localhost:9000/pig_Output/ ' USING PigStorage (',');
3、Apache Pig Diagnostic运算符
Load
语句会简单地将数据加载到Apache Pig中的指定关系中。要验证Load
语句的执行,必须使用Diagnostic
运算符。Pig Latin提供四种不同类型的诊断运算符:
3.1 Dump运算符
dump 主要用于调试,就是直接将结果打印到屏幕。
A = LOAD 'a.txt' AS (col1:chararray, col2:int, col3:int, col4:int, col5:double, col6:double);
DUMP A
DUMP
的输出是元组
3.2 Describe运算符
describe
运算符用于查看关系的模式。类似hive里的desc
查看表结构
Describe A
3.3 Explanation运算符
explain
运算符用于显示关系的逻辑,物理和MapReduce执行计划。类似hive 里的explain
explain A
3.4 Illustration 运算符
illustrate 运算符为你提供了一系列语句的逐步执行,差不多可以理解为一条条查看执行结果。
illustrate Relation_name;
4、分组和连接
4.1 group 运算符
GROUP
运算符用于在一个或多个关系中对数据进行分组,它收集具有相同key的数据。每条结果以元组形式输出。
-- 按照 age 分组
A = LOAD 'a.txt' AS (age: int, name: chararray, city: chararray);
Group_data = GROUP A BY age;
-- 按照 age 和 city 分组
Group_multiple = GROUP A BY (age, city);
-- 按照所有的列对关系进行分组
Group_all = GROUP A ALL;
group all 输出结果是一个元组 (all ,{(..),(..),...})
4.2 cogroup运算符
COGROUP
运算符的运作方式与 GROUP
运算符相同。两个运算符之间的唯一区别是 group
运算符通常用于一个关系,而 cogroup
运算符用于涉及两个或多个关系的语句。
student_details = LOAD 'hdfs://localhost:9000/pig_data/student_details.txt' USING PigStorage(',')
as (id:int, firstname:chararray, lastname:chararray, age:int, phone:chararray, city:chararray);
employee_details = LOAD 'hdfs://localhost:9000/pig_data/employee_details.txt' USING PigStorage(',')
as (id:int, name:chararray, age:int, city:chararray);
cogroup_data = COGROUP student_details by age, employee_details by age;
-- cogroup 有点像hive里的full outer join的感觉,两个文件按照age分组,
-- 如果某个文件里其中一个age的值没有,那么会在结果里用 {} 补齐
4.3 用cogroup 实现求差集
在hive里求差集一般用left join实现,例如table_a和table_b里都只有一个id字段,现在想找出在table_a里但是不在table_b里的id
-- hive 实现
select
a.id
from (
select
id
from table_a
) a
left join (
select
id
from table_b
) b
on a.id=b.id
where b.id is NULL
再看一些pig如何实现
A = LOAD 'table_a' USING PigStorage('\t') AS (id: chararray);
B = LOAD 'table_b' USING PigStorage('\t') AS (id: chararray);
C = COGROUP A BY id, B BY id;
D = FILTER(A) IsEmpty(B);
E = FOREACH D GENERATE FLATTEN(A);
E = FOREACH E GENERATE A::id as id;
5、join 运算符
5.1 self-join & inner-join
self-join和inner-join 语法一样,只不过self-join是自己关联自己,定义关系的时候同一份数据load
给两个不同的relation
Relation3_name = JOIN Relation1_name BY key, Relation2_name BY key ;
5.2 outer-join
类比于hive 里的left join, right join,full outer join
Left Outer Join(左外连接)
left outer join操作返回左表中的所有行,即使右边的关系中没有匹配项。
语法如下:
Relation3_name = JOIN Relation1_name BY id LEFT OUTER, Relation2_name BY customer_id;
Right Outer Join(右外连接)
right outer join操作将返回右表中的所有行,即使左表中没有匹配项。
语法如下:
Relation3_name = JOIN Relation1_name BY id RIGHT, Relation2_name BY customer_id;
Full Outer Join(全外连接)
当一个关系中存在匹配时,full outer join操作将返回行。
语法如下:
Relation3_name = JOIN Relation1_name BY id FULL OUTER, Relation2_name BY customer_id;
6、cross运算符
CROSS
运算符计算两个或多个关系的向量积。本章将以示例说明如何在Pig Latin中使用cross
运算符。
可以理解为计算笛卡尔积
语法如下:
cross_data = CROSS customers, orders;
7、union运算符
Pig Latin的 UNION
运算符用于合并两个关系的内容。要对两个关系执行UNION
操作,它们的列和域必须相同。
语法如下:
Relation_name3 = UNION Relation_name1, Relation_name2;
8、split运算符
SPLIT
运算符用于将关系拆分为两个或多个关系
语法如下:
SPLIT Relation_name INTO Relation1_name IF (condition1), Relation2_name (condition2);
9、filter运算符
FILTER
运算符用于根据条件从关系中选择所需的元组。
语法如下:
Relation2_name = FILTER Relation1_name BY (condition);
filter_data = FILTER student_details BY city == 'Chennai';
10、distinct运算符
DISTINCT
运算符用于从关系中删除冗余(重复)元组。
语法如下:
distinct_data = DISTINCT student_details;