8.使用PIG进行数据预处理

MapReduce

mapreduce是一种并行编程模型,用于编写geogle设计的分布式应用程序,以便于以可靠,容错的方式在商品硬件的大型群集(数千个节点中)上高效处理大量数据。

mapreduce程序在Hadoop(一个apache开源框架)上运行。

mapreduce是基于Java的分布式计算的处理技术和程序模型。Mapreduce算法包含两个重要任务,即Map和Reduce。Map获取一组数据,并将其转换为另一组数据,其中各个元素分解为元组。reduce任务,他将map的输出作为输入并将这些数据元组组合为较小的元组集。

reduce任务总是在map任务之后。

apache pig

apache pig是mapreduce的抽象。它是一种平台,用于分析将较大的数据集表示为数据流的数据。

pig的主要操作如下:

1.载入和存储

(1)load(载入)

从文件系统或者其他存储载入数据到一个relation,load语句由两部分组成,用“=”运算符分隔。在左侧为存储数据关系的名称,右侧为定义如何存储数据。

语法如下:

Relation_name=load'input file path'using function as schema;

 (2)store(存储),保存relation到文件系统或者其他存储Store语法格式。

store relation_name into 'required_directory_path'[using function];

(3)DUMP(备份):输出一个relation到控制台。

在控制台上打印关系的内容。

2.过滤

(1)Filter运算符

filter运算符用于根据条件从关系中选择所需的元组。

relation2_name = filter relation1_name BY(condition):

ep:在一个名为 student_details.txt的文件中过滤出chennai的城市信息。

 内容如图所示:

将此文件通过关系student_details加载到pig如图所示:

 

(2).Distinct运算符

distinct运算符用于从关系中删除冗余元组。

relation_name2 = DISTINCT Relation_name1;

 使用dump distinct_data命令,控制台输出

 

(3).Foreach

Foreach运算符用于基于列数据生成指定的的数据转换,其语法格式:

relation_name2 = foreach relation_name1 generate(required data);

 现在要从关系 student_details 中获取每个学生的id,age和city值,并使用foreach运算符将它存储到另一个foreach_data关系中如图所示:

foreach_data = foreach student_datails generate id,age,city;

之后呢使用dump foreach_data输出:

 3.分组和关联

(1)JOIN

用于组合两个或多个关系的记录。在执行连接操作时,从每个关系中声明一个元组作为key。当这些key匹配时,两个特定的元组匹配,否则记录将被丢弃,连接可以是以下类型:self-join,innner-join,outer-join.

ep:

在HDFS的pig_data目录中有两个文件。

 将两个文件载入到pig中

 现在让这两对关系执行各种连接操作,self-join

relation3_name=join relation1_name by key,relation2_name by key

自连接将表与自身连接,就像表是两个关系一样,临时重命名至少一个关系,为了执行self-join,将在不同的别名下加载相同的数据。

 

 Inner Join(内部连接)

Inner Join 也被称为等值连接。当两个表都存在匹配时,内部连接将返回行。A与B的每个匹配的行对的列值被组合成结果行。

形式如下:

result=join relation by columnname,relation2 by columnname

outer join(外部连接)

注意:outer join 和 inner join不同,outer join返回至少一个关系中的所有行。外部连接操作以三种方式进行:left outer join,right outer join,full outer join

left outer join(左外连接)返回左表中的所有行,即使右边的关系中没有匹配项。

语法:

relation3_name=join relation1_name by id left outer, relation2_name by customer_id;

 

 同理是右外连接(right outer join)

返回右表中的所有行,即使左表中没有匹配项

语法:

outer_right=JOIN customers by id right, orders by customer_id;

 

 

full outer join(全外连接)

当一个关系中存在匹配时,full outer join 操作将返回行。

outer_full=join customers by id full outer,orders by custommer_id;

 (2)GROUP

GROUP运算符用于在一个或多个关系中对数据进行分组,它收集具有相同key数据,其语法格式如图所示:

group_data=group relation_name by age;

ep:

将这个文件加载到apache pig中华,关系名称为students_details如图所示:

student_details = load 'hdfs://localhost:9000/pig_data/student_details.txt' using pig storage(’,‘)

as(id:int,firstname:chararray,lastname:chararray,age:int,phone:chararray,city:chararray);

现在按照年龄关系中的记录/元组进行分组如图:

group_data = group student_details by age;

使用dump group_data输出到控制台。

 

 

 

 (3)gogroup

与group运算符运作方式相同,两个运算符之间的唯一区别是group运算符通常用于一个关系,而gogroup运算符用于涉及两个或多个关系的语句。使用gogroup分组两个关系。

目录下的两个文件如下:

 

 

 4.排序

(1)order by

用于显示一个或多个字段的排序显示关系的内容。

relation_name2=order relation_name1 by(ASC|DESC)

 

 现在根据学生的年龄以及降序排列关系,并使用order by运算符将它存储到另一个名为order——by_data的关系中,如图:

 (2)LIMIT

LIMIT运算符用于从关系中获取有限数量的元组。

result=limit relation_name required number of tuples;

使用limit运算符将从关系中获取数量为4的元组存储到另一个名为limit_data的关系中,如图所示:

limit_data=limit student_details 4;

使用dump运算符验证关系limit_data如图所示L:

 (5)组合和分隔

a.union

pig的union运算符用于合并两个关系的内容,要求两个关系执行union操作,他们的列和域必须相同. 

relation_name3=union relation_name1,relation_name2;

 b.split

用于将关系分为两个或多个关系中,语法如图:

split relation1_name into relation2_name IF(condition1), relation2_name(condition2);

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值