Apache Pig语法简述

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提供四种不同类型的诊断运算符:

  • Dump运算符
  • Describe运算符
  • Explanation运算符
  • Illustration运算符

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 运算符

  • Self-join
  • Inner-join
  • Outer-join − left join, right join, and full 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;
发布了114 篇原创文章 · 获赞 55 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/zuolixiangfisher/article/details/90237565