现在的位置: 首页 > 综合 > 正文

hadoop子项目—pig

2014年06月14日 ⁄ 综合 ⁄ 共 4482字 ⁄ 字号 评论关闭

1、Pig包括用于描述数据流的语言Pig Latin和用于运行Pig Latin的执行环境(单JVM中的本地执行环境和hadoop集群上的分布式环境)。

2.Pig会扫描整个数据集或其中很大的一部分,因此它不支持低延迟查询。

3.Pig的执行模式分为本地模式pig -x local
(访问本地文件系统,适用于小规模数据集)和mapreduce模式(Pig将查询翻译为mapreduce作业,在集群上运行,(伪)分布式,适合大规模数据集)。默认为mapreduce模式。

4.Pig是一种数据流编程语言,Pig能和UDF集成;SQL是一种描述性编程语言。

5.RDBMS把数据存储在严格定义了模式的表中(hive也是);Pig对其处理的数据要求宽松。

6.Pig中注释:双减号--或者/* */

7.每条语句会加入到程序逻辑计划,在整个程序逻辑计划还没有构造完成前,Pig不会处理数据。让Pig开始处理的语句DUMP,STORE.

8.Pig Latin中关系操作的关键字:
load store...into... dump
filter distinct foreach...generate...
stream sample join cogroup group
cross order union split

9.Pig Latin的诊断操作:
 describeexplain illustrate

10.Pig Latin UDF语句:
 register 在pig运行时环境中注册一个jar文件
 define 为UDF、流式脚本或命令规范新建别名

11.Pig Latin数据类型:
 int longfloat double chararray(文本字符数组) bytearray(二进制字节数组)
 tuple(任何类型的字段序列) bag(元组的无序多重集合) map(键值对,键必须是字符数组,值任何类型)。

12.Pig的内置函数:
 AVG CONCAT(数组连接) COUNT(非空项个数)
COUNTSTAR(项个数)DIFF(两个包的差)
 MAX MIN SIZESUM TOKENIZE
ISEMPTY PigStorage BinStorage BinaryStorageTextLoader PigDump

 

13.Pig实战:
首先编写两个数据文件A:

0,1,2

1,3,4

数据文件B

0,5,2

1,7,8

运行pig

$ pig -x local

grunt>

加载数据A

grunt> a = load 'A' using PigStorage(',')as (a1:int, a2:int, a3:int);

加载数据B

grunt> b = load 'B' using PigStorage(',')as (b1:int, b2:int, b3:int);

ab的并集:

grunt> c = union a, b;

grunt> dump c;

(0,5,2)

(1,7,8)

(0,1,2)

(1,3,4)

c分割为de,其中d的第一列数据值为0e的第一列的数据为1$0表示数据集的第一列):

grunt> split c into d if $0 == 0, e if $0== 1;

查看d

grunt> dump d;

(0,1,2)

(0,5,2)

查看e

(1,3,4)

(1,7,8)

选择c中的一部分数据:

grunt> f = filter c by $1 > 3;

查看数据f

grunt> dump f;

(0,5,2)

(1,7,8)

对数据进行分组:

grunt> g = group c by $2;

查看g:

grunt> dump g;

(2,{(0,1,2),(0,5,2)})

(4,{(1,3,4)})

(8,{(1,7,8)})

当然也能够将所有的元素集合到一起:

grunt> h = group c all;

grunt> dump h;

(all,{(0,1,2),(1,3,4),(0,5,2),(1,7,8)})

查看h中元素个数:

grunt> i = foreach h generate COUNT($1);

查看元素个数:

grunt> dump i;

接下俩试一下jon操作:

grunt> j = join a by $2, b by $2;

该操作类似于sql中的连表查询,这是的条件是$2
== $2

取出c的第二列$1$1
* $2
,将这两列保存在k中:

grunt> k = foreach c generate $1, $1 *$2;

查看k的内容:

grunt> dump k;

(5,10)

(7,56)

(1,2)

(3,12)
 
14.pig实战练习:
(1).以本地模式启动pig,pig -x local

在这种情况下,不需要将数据存储到某个文件中,只需将它转储为一组关系。

操作/var/log/messages里面的数据,其部分数据为:


Grunt>messages= LOAD '/var/log/messages';

grunt>warns = FILTER messages BY $0 MATCHES '.*WARN+.*';

grunt>dump warns;

.......

(May23 18:52:28 master NetworkManager[1490]: <warn> bluez error gettingdefault adapter: The name org.bluez was not provided by any .service files)

(May23 11:13:18 master NetworkManager[2045]: <warn> bluez error gettingdefault adapter: The name org.bluez was not provided by any .service files)

(2)以Mapreduce 模式启动Pig

对于 MapReduce 模式,必须首先确保 Hadoop 正在运行。要做到这一点,最简单的方法是在 Hadoop 文件系统树的根上执行文件列表操作。

操作/etc/passwd里面的数据,其部分数据为:



[root@master ~]# pig
 
grunt>cd hdfs:///
 
grunt>ls

hdfs://master:9000/hbase<dir>

hdfs://master:9000/home<dir>

hdfs://master:9000/tmp<dir>

hdfs://master:9000/user<dir>

hdfs://master:9000/usr<dir>
 
grunt>mkdir pigtest
 
grunt>cd pigtest
 
grunt>copyFromLocal /etc/passwd passwd
 
grunt>ls

hdfs://master:9000/pigtest/passwd<r 3>1745
 
将文件读入一个关系中

grunt>passwd = LOAD '/pigtest/passwd' USING PigStorage(':') AS(user:chararray,passwd:chararray, uid:int, gid:int, userinfo:chararray,home:chararray, shell:chararray);

grunt>DUMP passwd;

过滤查询一些记录:

grunt>warns = FILTER passwdBY $0 MATCHES '.*nobody.*';

grunt>DUMP warns;

grunt>warns = FILTER passwdBY $4MATCHES '.*bus.*';

grunt>DUMP warns;

将元组分组为其外壳的一个函数

grunt>grp_shell = GROUP passwd BY shell;

grunt>DUMP grp_shell;

(/bin/bash,{(mysql,x,27,27,MySQLServer,/var/lib/mysql,/bin/bash),(root,x,0,0,root,/root,/bin/bash),(hadoop,x,500,500,,/home/hadoop,/bin/bash)})

(/bin/sync,{(sync,x,5,0,sync,/sbin,/bin/sync)})

(/sbin/halt,{(halt,x,7,0,halt,/sbin,/sbin/halt)})

.....

利用每个外壳的计数对结果进行分组

grunt>counts = FOREACH grp_shell GENERATE group, COUNT(passwd);

grunt>DUMP counts;

(/bin/bash,3)

(/bin/sync,1)

(/sbin/halt,1)

(/sbin/nologin,30)

(/sbin/shutdown,1)

如果要将该代码作为一个脚本来执行,只需将脚本输入到某个文件中,然后使用 pig myscript.pig
来执行它。

 


Pig中一些基本函数的使用:

a = load ‘/user/root/data1.txt’using PigStorage(‘,’) as (year:int,month:int,day);

b = group a byyear;

C = load ‘/user/root/data2.txt’using PigStorage(‘,’) as (name:chararray,month:int,day:int);

1.AVG求平均值:

Avg = foreach bgenerate group,AVG(a.month);

2.COUNT函数的使用;

Count = foreach bgenerate group,COUNT(a.day);

3.MAX,MIN函数的使用:

Max = foreach bgenerate group,MAX(a.day);

4.SUM求和函数的使用:

Sum = foreach bgenerate group,SUM(a.day);

5.order排序的使用:

Order_a = order aby day desc;(默认为升序)

6.store存储到自定义目录:

store a into ‘...’

7.cat查看存储的数据:

Cat   pigdata/data1

8.Cross获取多个关系的乘积(叉乘):

R = cross a,b

9.distinct去重重复的:

distinct_records=distinct  a;

10.limit函数的使用:

T =limit 
b 10;

11.union函数的使用:

 R = union a ,b;

12.CONCAT连接函数的使用:

concat_c=foreachc generate CONCAT('001-',name);

13.SIZE函数统计字母的个数:

size_records=foreach c generate SIZE(name);

14.TOKENIZE分割函数的使用:

t_records=load './Desktop/data-3.txt' as(str:chararray);

tokenize_records=foreach t_records generate TOKENIZE(str);

15.split分割函数的使用:

Split cinto d if $0==0,e if $0==1;

16.join函数的使用:

I = join aby $2,b by $2;(他们相等的就join)

 

 

 

抱歉!评论已关闭.