收藏 分享(赏)

《云计算与大数据概论》课件第7章 pig.pptx

上传人:bubibi 文档编号:21763249 上传时间:2024-04-23 格式:PPTX 页数:31 大小:354.96KB
下载 相关 举报
《云计算与大数据概论》课件第7章 pig.pptx_第1页
第1页 / 共31页
《云计算与大数据概论》课件第7章 pig.pptx_第2页
第2页 / 共31页
《云计算与大数据概论》课件第7章 pig.pptx_第3页
第3页 / 共31页
《云计算与大数据概论》课件第7章 pig.pptx_第4页
第4页 / 共31页
《云计算与大数据概论》课件第7章 pig.pptx_第5页
第5页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、目标了解Pig的作用了解Pig的设计思想了解Pig的运行模式掌握PigLatin的基础知识掌握Pig脚本的运行方法Pig概述Pig是Hadoop的一个扩展,它简化了Hadoop的编程,提供了一套高级数据处理语言,且保持了Hadoop易于扩展与可靠的特性。Pig有两个主要的组成部分:高级数据处理语言PigLatin;依据可供抽样的评价机制编译与运行PigLatin脚本的编译器。PigLatin是Pig的脚本语言,主要特性:易于编程、自动优化、可扩展性Pig的用途Pig的主要应用场景是传统的数据流处理、原生数据研究和迭代处理。另外,Pig还可以用来处理离线用户数据,对用户行为进行预测,比如扫描所有

2、的用户和网站的交互数据,将用户进行分类,对每一类建立一个数学模型,通过分析该模型,可以预测某类用户对各种类型的广告或新闻会作出怎样的反应,从而有针对性地展示这类用户感兴趣的广告。Pig采用面向数据批处理的模式,因此,如果需要处理大量的数据,如GB或者TB数量级的数据,则Pig是个不错的选择,但对于需要写单条或者少量记录的任务,Pig并非十分适用。Pig的设计思想Pig的主要设计思想:不管数据是否有元数据,Pig都可以操作;不管数据是关系型的、嵌套型的或者是非结构化的,Pig都可以操作;Pig还应该很容易扩展,不仅可以操作文件,还可以操作键值型的存储和数据库等。Pig的设计目标并非是只能用于Ha

3、doop平台。目前,Pig支持用户自定义字段类型转换函数、用户自定义聚合方法函数和用户自定义条件式函数,允许用户随时整合加入自己的代码。Pig还有一个优化控制器,可以重新排列脚本中的操作过程以达到更好的性能,如果用户不希望进行这种优化,也可以很容易地将该控制器关闭,就不会改变执行过程。Pig的运行模式-1Pig有两种运行模式:Local模式和MapReduce模式,默认使用MapReduce模式。当Pig在Local模式下运行时,Pig只访问本地一台主机;而当Pig在MapReduce模式下运行时,它将访问一个Hadoop集群和HDFS的安装位置,此时Pig将自动对这个集群进行分配和回收。Pi

4、g的Local模式和MapReduce模式都有三种运行方式,分别为GruntShell方式、脚本文件方式和嵌入式程序方式。Pig的运行模式-21.Local模式在Local模式下,Pig在单个JVM中访问本地文件系统,该模式用于测试或处理小规模数据集。1)GruntShell方式在Linux终端中执行如下命,开启Pig的GruntShell窗口。$pigxlocalGruntShell窗口与Windows系统中的Dos窗口非常类似,用户可以在这里逐条输入命令对数据进行操作。Pig的运行模式-32)脚本文件方式该方式以脚本文件来进行Pig命令的批处理运行,这些脚本文件实际上是Pig命令的集合。执

5、行如下命令,可在本地模式下运行Pig脚本。$Pigxlocalscript.Pig其中,script.Pig是要运行的Pig脚本,这里需要正确指定该Pig脚本的位置,否则系统将无法识别,例如,假设Pig脚本位于/root/PigTmp目录下,则需要写出此脚本的完整路径“/root/PigTmp/script.Pig”。Pig的运行模式-43)嵌入式程序方式与运行普通的Java程序相同,首先需要编写特定的Java程序,并将其编译生成对应的.class文件或package包,然后调用main函数运行该程序。可以使用如下命令,对Java源文件进行编译。$javaccpPig*.*.*core.jar

6、local.javaPig*.*.*core.jar为Java源文件编译过后的打包文件,位于Pig安装目录下,local.java为用户编写的Java源文件,两个文件都需要正确指定其位置。编译完成后,Java会生成一个文件local.class,可以使用如下命令,调用此文件。$javacpPig*.*.*core.jar:.localPig的运行模式-52.MapReduce模式在MapReduce模式下,Pig可以访问整个Hadoop集群,处理大规模数据集。1)GruntShell方式在Linux终端上执行如下命令,就可以进入GruntShell的MapReduce模式。$Pigxmapre

7、duce2)脚本文件方式执行如下命令,可以在MapReduce模式下运行Pig脚本文件。$Pigxmapreducescript.Pig3)嵌入式程序方式与Local模式相同,在MapReduce模式下运行嵌入式程序同样需要经过编译和执行两个步骤,可以使用如下命令完成相应操作。javaccpPigxxxcore.jarmapreduce.javajavacpPigxxxcore.jar:.mapreducePig LatinPigLatin是Pig针对MapReduce算法(框架)开发的一套Shell脚本,类似用户熟悉的SQL语句,这套脚本可以对加载完毕的数据进行排序、过滤、求和、分组(gro

8、upby)、关联(joining)等操作。PigLatin是一种数据流语言,每一步处理都会产生一个新的数据集或者一个新的关系,比如下面这个脚本:input=loaddata该脚本中,“input”是加载数据集data之后的结果的关系名称,这里的关系名称即指通常所说的别名,但需要注意的是,关系名称与变量不同,一旦声明了,这个名称就是不变的了。Pig中的另一个常见概念是字段名称,它是一个关系所包含的字段(或者称为列)的名称。关系名称和字段名称都必须以字母字符开头,后面可以跟上零个或多个字母、数字或者下划线。Pig中的关系名称和字段名称是大小写敏感的,例如“A=loadfoo;”和“a=loadfo

9、o;”是不等价的;但是,Pig中的关键字是不分大小写的,例如LOAD和load就是等价的。Pig Latin读写和检测操作符PigLatin中使用的读/写操作符如表:操作符操作符说明明LOAD语法:alias=LOADfileUSINGfunctionASschema;作用:从文件中装载数据。如果不使用USING选项,则默认使用PigStorage装载函数。数据可以使用AS选项给出schemaLIMIT语法:alias=LIMITaliasn;作用:限制元素个数为n,即当作用于alias时,LIMIT返回前n个元素,如不使用,则不能保证哪些元素会被返回DUMP语法:DUMPa1ias;作用:在

10、屏幕上显示数据STORE语法:STOREaliasINTOdirectoryUSINGfunction;作用:将一个关系中的数据存储到一个目录中,并把关系存储在以“partnnnnn”为名的文件中,如果不使用USTNG选项特别指定,则默认使用PigStorage存储函数PigLatin入门例子:在Pig安装目录下有一个文件tutoria1/data/excitesmall.log,其中的数据分为3列,中间用制表符分隔,第一列为用户ID,第二列为Unix时间戳,第三列则为查询记录。首先,从该文件的4500条记录中,选取一段样本如下。3F8AAC2372F6941C970916091301 bac

11、3F8AAC2372F6941C970916091354 bloodalcoholcontent3F8AAC2372F6941C9709160914253F8AAC2372F6941C9709160915453F8AAC2372F6941C9709160934483F8AAC2372F6941C970916093544 breathalizers3F8AAC2372F6941C970916093551 breathalizers3F8AAC2372F6941C970916093642 breathalizers3F8AAC2372F6941C970916093724 minorsinposse

12、sion3F8AAC2372F6941C970916093848 minorsinpossesion3F8AAC2372F6941C970916093904 mip然后,在GruntShell中输入如下命令,将数据装载到一个称为log的别名中。gruntlog=LOADtutoria1/data/excitesmall.LogAS(user,time,query);LIMIT命令允许指定有多少元组(行)用于返回结果。本例中,如果要查看别名log的4个元组,则可使用以下命令。grunt1mt=LIMITlog4;gruntDUMP1mt;返回结果如下。2A9EABFB35F5B954970916

13、105432+mdfoods+proteinsBED75271605EBD0C970916001949yahoochatBED75271605EBD0C970916001954yahoochatBED75271605EBD0C970916003523yahoochat执行以下命令,完成统计每个用户发起的查询个数。gruntlog=LOADtutorial/data/excitesmall.logAS(user:chararray,time:long,query:chararray);gruntgrpd=GROUPlogBYuser;gruntcntd=FOREACHgrpdGENERATEgr

14、oup,COUNT(log);gruntSTOREcntdINTOoutput;部分统计结果如下。002BB5A52580A8ED18005BD9CD3AC6BB381800A08A54CD03EB953011ACA65C2BF70B2501500FAFE317B7C0150158F8ACC570947D3018FBF6BFB213E681019E9463F669596310Pig Latin数据类型和schemaPig有6个简单的原子类型和3个复杂的类型。原子类型包括数字标量、字符串和二进制对象,类型间转换的实现和常规方式相同,除非特别声明,字段默认为bytearray。数据数据类型型说明明

15、int整数,存储一个4个字节大小的带符号整数,如36long长整型,存储一个8个字节大小的带符号整数,以一个结尾为L的整数来表示,如50000000000Lfloat浮点数,用4个字节存储值,通过一个浮点数加上f来表示,例如3.14fdouble双精度浮点数,用8个字节存储值,可以使用简单的格式表示,例如3.25628hararray字符串或者字符数组,以加单引号的一系列字符来表示,如food,也可以通过转义符反斜杠表示一些特定的字符,例如n表示回车bytearray一组字节,通过封装Java的byte的DataByteArray类来实现,没有办法单独定义一个bytearray常量3个复杂数据

16、类型是元组(tuple)、包(bag)和映射表(map)。数据数据类型型说明明例子例子tuple(元(元组)一个定长的包含有序Pig数据元素的集合,一个元组相当于SQL中的一行,而元组的字段相当于SQL中的列,其表现形式为逗号分隔的字段,前后用小括号包裹(helloworld,12.5,2,123)bag(包)(包)元组的无序集合(允许元组重复),表示为逗号分隔的元组,前后由大括号包裹,一个包中的元组不必有相同的schema,甚至字段也不必相同(hello world,12.5,2,123),(2.87,byeworld,10)map(映射)(映射)一 组 键 值 对,键 必 须 是 唯 一

17、的 字 符 串(chararray),值可以是任意类型的数据name#bob,age#21除了为字段声明类型,schema还可以为字段命名,使它们更易于引用,用户可以在LOAD、STREAM和FOREACH命令中使用AS关键字为关系定义字段名。在定义schema时,如果遗漏了类型,Pig会默认将bytearray作为最常用的类型。也可以不设置字段的名称,此时该字段的状态为未命名,只能通过位置来引用它。Pig Latin表达式和函数将表达式和函数应用于数据字段,可以计算出各种数值。最简单的表达式为常数值。表达式也可以引用一个字段的值,既可以通过名字直接引用命名字段的值,也可以使用$n命令引用一个

18、未命名的字段,这里的n是该字段在元组中的位置,从0开始计数。例如,关系log有3个命名的字段,分别为user、time和query,则可以通过“time”或者“$1”来引用time字段。Pig还支持标准算术表达式、比较表达式、条件表达式、类型转换表达式和布尔表达式,它们常见于大多数流行的编程语言中,如表表达式表达式说明明12,19.2,hello world常数值,没有小数点的数值为int型,数字之后带有l或L则为long型;带有小数点的数值为double型,数字之后有f或者F则为float型+,-,*,/加减乘除+x,-x负号(),改变一个数字的符号t(x)将x的值转换为t类型x%yx被y除

19、的余数(x?y:z)如果x为真则返回y,否则为z,该表达式必须用圆括号包裹=,!=,=分别为等于,不等于,小于,大于,不大于,不小于x matches regex与字符串x匹配的正则表达式x is nullx is not null检查x是否为空x and y,x or ynot x布尔值:与、或、非Pig也支持函数,Pig的内置函数及用法如下:avg用法avg(expression):计算单列值的平均数,忽略NULL值,在使用groupall或group单列后可使用。contact用法contact(expression1,expression2):将两个字段的值拼接为一个字符串,如果其中一

20、个为NULL,则结果用NULL表示。count用法count(expression):统计在一个bag中所有元素的数量,不包含NULL值统计,同时需要以group的支持为前提。diff用法diff(expression1,expression2),比较一个元组中的两个fields集合的差异性,与Linux或Python里面的diff函数类似。IsEmpty用法IsEmpty(expression):判断一个bag或map是否为空(没有数据),可以用在filter数据过滤中。max用法max(expression):计算单列中最大的数值,或者字符串的最大值(字典排序),同count一样需要gro

21、up支持。min用法min(expression):计算单列中最小的数值,或者字符串的最小值(字典排序),同count一样需要group支持。size用法size(expression):计算任何Pig字符串的大小长度,或者集合类型的的长度。subtract用法subtract(expression1,expression2):对两个bag里面的元组做差值操作。sum用法sum(expression):对某列求和,需要提前使用group分组。tokenize用法tokenize(expression,field_delimiter):按照指定分隔符拆分一句话,然后转成一系列的words。Pig

22、 Latin关系型运算符有两个文件A与B,A文件内容如下。0,1,21,3,4B文件内容如下。0,5,21,7,8定义关系a与b,代码如下。grunta=loadAusingPigStorage(,)as(a1:int,a2:int,a3:int);gruntb=loadBusingPigStorage(,)as(b1:int,b2:int,b3:int);gruntDUMPa;(0,1,2)(1,3,4)gruntDUMPb;(0,5,2)(1,7,8)1.UNION和SPLITUNION将多个关系归并在一起,SPLIT则将一个关系分割为多个,代码如下。gruntc=UNIONa,b;gru

23、ntDUMPc;(0,1,2)(1,3,4)(0,5,2)(1,7,8)gruntSPLITcINTOdIF$0=0,eIF$0=1;gruntDUMPd;(0,1,2)(0,5,2)gruntDUMPe;(1,3,4)(1,7,8)UNION运算符允许重复,可以使用DISTINCT运算符对关系进行去重(dis=distinctc;)。在c上的SPLIT操作将一个元组传给另一个关系,如果第一个字段($0)为0,则送到d,如果为1,则送到e。2.FILTER单独的FILTER运算符会将一个关系裁剪为能够通过某种测试的元组。gruntf=FILTERcBY$13;gruntDUMPf;(0,5,2

24、)(1,7,8)上述代码的意思是:如果第二个字段($1)3,则将此元组传送给f。3.SAMPLELIMIT被用于从一个关系中取出指定个数的元组,而SAMPLE运算符则根据特定的比例从一个关系中随机地取样出元组,用法为“SAMPLE别名size,size范围0,1”,示例如下。gruntc_sample=SAMPLEc0.4;gruntDUMPc_sample;(1,3,4)(0,5,2)4.GROUP下列代码生成了一个新的关系g,它是对c中第3列($2,也被命名为“a3”)的相同元组进行组合的结果。gruntg=GROUPcBY$2;gruntDUMPg;(2,(0,1,2),(0,5,2)(

25、4,(1,3,4)(8,(1,7,8)gruntDESCRIBEc;c:a1:int,a2:int,a3:intgruntDESCRIBEg;g:group:int,c:(a1:int,a2:int,a3:int)GROUP的输出通常有两个字段:第一个字段为组键,本例中为a3;第二个字段是一个包(bag),包含组键相同的所有元组。观察变量g的dump值,可以看到它有3个元组,分别对应于变量c中第3列的3个专有值:第一个元组中的包代表c中第3列等于2的所有元组;在第二个元组中的包代表c中第3类等于4的所有元组,以此类推。5.JOIN类似于SQLJOIN,通过两个或多个表中的键将不同的关系联系起来

26、,示例如下。gruntj=JOINaBY$2,bBY$2;gruntdumpj;(0,1,2,0,5,2)gruntDESCRIBEj;j:a:a1:int,a:a2:int,a:a3:int,b:b1:int,b:b2:int,b:b3:int左外连接示例如下。gruntl=JOINaBY$2LEFTOUTER,bBY$2;gruntdumpl;(0,1,2,0,5,2)(1,3,4,)全外连接示例如下。gruntf=JOINaBY$2FULL,bBY$2;gruntdumpf;(0,1,2,0,5,2)(1,3,4,)(,1,7,8)右外连接示例如下。gruntl=JOINaBY$2RIG

27、HTOUTER,bBY$2;gruntdumpl;(0,5,2,0,1,2)(1,7,8,)6.FOREACH和FLATTENFOREACH和FLATTEN浏览一个关系中的所有元组,并在输出中生成新的元组。gruntk=FOREACHcGENERATEa2,a2*a3;gruntDUMPk;(1,2)(3,12)(5,10)(7,56)FLATTEN函数可以移除嵌套的层次,将嵌套式数据类型平坦化,几乎就是建包的反向操作。FLATTEN函数可以改变由FOREACHGENERATE产生输出的结构,其平坦化的特性也会根据应用方式和应用目标的不同而有所不同。例如,语句FOREACHGENERATE$0

28、,FLATTEN($1)会为每个输入元组生成一个形式为(a,b,c)的输出元组,代码如下。gruntk=FOREACHgGENERATEgroup,FLATTEN(c);gruntDUMPk;(2,0,1,2)(2,0,5,2)(4,1,3,4)(8,1,7,8)gruntDESCRIBEk;k:group:int,c:a1:int,c:a2:int,c:a3:intPig Latin用户定义函数PigLatin设计的基本理念是通过用户定义函数(UDF,UserDefinedFunction)获得扩展性,并为编写UDF提供一组定义良好的API。Pig支持两种主要类型的UDF(用户定义函数):e

29、val和load/store。其中,load/store函数仅在LOAD和STORE语句中使用,来帮助Pig读写特殊的格式;大多数的UDF为eval函数,即取出一个字段值,然后返回另一个字段值。例:给出一个学生表(学号,姓名,性别,年龄,所在系),其中含有如下几条记录。201000101:李勇:Boy:20:计算机软件与理论201000102:王丽:Giri:19:计算机软件与理论201000103:刘花:Girl:18:计算机应用技术201000104:李肖:Boy:19:计算机系统结构201000105:吴达:Boy:19:计算机系统结构201000106:李可:Boy:19:计算机系统结

30、构它们所对应的数据类型如下所示,各字段与数据类型之间通过冒号(半角英文标点)隔开。Student(Sno:chararray,sname:chararray,Ssex:chararray,Sage:int,Sdept:chararray)下面我们将编写一个UDF,将所有的小写字母转换成对应的大写字母,代码如下。1importjava.io.IOException;2importorg.apache.Pig.EvalFunc;3importorg.apache.Pig.PigWarning;4importorg.apache.Pig.data.Tuple;5publicclassUPPERext

31、endsEvalFunc6publicStringexec(Tupleinput)throwsIOException7if(input!=null&input.size()!=0&input.get(0)!=null)8Stringstr=null;9try10str=(String)input.get(0);11returnstr.toUpperCase();12catch(ClassCastExceptionvar4)13this.warn(unabletocastinput+input.get(0),PigWarning.UDF_WARNING_1);14returnnull;15cat

32、ch(Exceptionvar5)16this.warn(Errorprocessinginput+input.get(0),PigWarning.UDF_WARNING_1);17returnnull;1819else20returnnull;212223使用使用UDF下列代码为Pig脚本myscript.Pig,它使用之前编写的UDF(已编译为myudf.jar)对上面给出的学生表进行了相应的操作。myscript.PigREGISTERmyudf.jar;A=LOADStudentusingPigStorage(:)as(Sno:chararrayy,Sname:chararray,Ss

33、ex:chararray,Sage:int,Sdept:chararray);B=FOREACHAGENERATEmyudf.UPPER(Ssex);DUMPB;执行该脚本文件,命令如下。Pigxmapreducemyscript.Pig使用参数xmapreduce可以指定函数运行的模式,如果只是为了对函数进行测试,建议在本地模式下运行,因为对于小文件来说,MapReduce模式的准备时间显得过长,有时甚至让用户觉得MapReduce模式下文件的运行效率比本地模式下还要低,但是为了验证函数的通用性,本例会使用MapReduce模式。脚本myscript.Pig的第2行提供了myudf.jar文

34、件的位置,该jar文件中包含我们刚刚编写的UDF。为了找到myudf.jar文件的位置,Pig会首先检査环境变量classpath,如果在classpath中找不到jar文件,Pig将假定地址为绝对地址或一个相对于Pig被调用位置的地址,如果jar文件依旧不能被发现,系统将返回一个错误。操作完成之后,可以在终端上看到Pig输出的正确结果。BOYGIRLBOYBOYBOYPig 脚本注释PigLatin支持单行和多行两种形式的注释:单行注释以双斜杠开始,在行尾结束;多行注释以“/*/”标记包裹,类似Java中的多行注释。例如,一个带有注释的PigLatin脚本代码如下。/*Myscript.Pi

35、g*用Pig编程*/log=LOADexcitesmall.logAS(user,time,query);lmt=LIMITlog;Onlyshow4tuplesDUMPlmt;EndofprogramPig 脚本参数替换Pig支持参数替换,允许用户在运行时指定参数信息,这些参数通过脚本中的前缀“$”来表示。例如,下面的脚本显示了用户指定日志文件的一组由用户设定的元组。log=LOAD$inputAS(user,time,query);lmt=LIMITlog$size;DUMPlmt;此脚本中的参数为$input和$size,如果使用Pig命令运行此脚本,则可以使用paramname=val

36、ue指定这些参数。Pigparaminput=excitesmall.logparamsize=4Myparams.Pig如果必须指定多个参数,一种更方便的做法是把它们放在某个文件中,并告知Pig执行脚本时使用基于该文件的参数替换。例如,创建Myparams.txt文件,代码如下。#Commentsinaparameterfilestartwithhashinput=excitesmall.logsize=4将参数文件通过变量param_file传递给Pig命令,代码如下。Pigparam_fileMyparams.txtMyscript.Pig在GruntShell中也可以执行exec命令和

37、run命令,以运行PigLatin脚本。exec命令和run命令支持使用相同的param和param_file参数进行参数替换,代码如下。gruntexecparaminput=excitesmall.logparamsize=4Myscript.Pig小结Pig有两个主要的组成部分:高级数据处理语言PigLatin及其编译器,后者依据可供抽样的评价机制编译与运行PigLatin脚本。Pig有两种运行模式,分别是Local模式和MapReduce模式,默认使用MapReduce模式。PigLatin文本语言的主要特性有三:易于编程,自动优化,可扩展性。PigLatin与SQL查询有两个主要区别

38、:首先,PigLatin是一种数据处理语言,它使用的是一个数据处理步骤的序列,而不是子句组成的复杂SQL查询;而且,SQL中的关系通常有固定的schema,在数据填充之前会先定义关系的schema,而Pig在schema方面则采取更为宽松的态度。PigLatin的基本设计理念是通过用户定义函数(UDF,UserDefinedFunction)获得扩展性,并为编写UDF提供一组定义良好的API。Pig有6个简单的原子类型和3个复杂的类型:原子类型包括数字标量、字符串和二进制对象;3个复杂数据类型分别是元组(tuple)、包(bag)和映射表(map)。Pig脚本的两个特有功能是注释和参数替换。谢 谢 Thanks for listening.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 职业教育

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:文库网官方知乎号:文库网

经营许可证编号: 粤ICP备2021046453号世界地图

文库网官网©版权所有2025营业执照举报