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);
求a,b的并集:
grunt> c = union a, b;
grunt> dump c;
(0,5,2)
(1,7,8)
(0,1,2)
(1,3,4)
将c分割为d和e,其中d的第一列数据值为0,e的第一列的数据为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)