Pig学习教程
Pig学习
1、Pig Latin简介
Pig是用来处理大规模数据的高级查询语言,结合Hadoop使用,可以在处理海量数据时达到事半功倍的效果。
Pig语句通常按照如下的格式来编写:
-
❑通过LOAD语句从文件系统读取数据。
-
❑通过一系列“关系转换”语句对数据进行处理。
-
❑通过STORE语句把处理结果输出到文件系统中,或使用DUMP语句把处理结果输出到屏幕上。
Pig有两种运行模式:Local模式和MapReduce模式。
Pig Latin是一种面向数据流的编程语言,一条语句就是一个操作,得到一个关系,一个Pig Latin程序由一组语句构成。
Pig Latin中常用命令有LOAD, STORE, FILTER, FOREACH,GROUP, ORDER, SPLIT, JOIN等。
常用交互命令
2、Pig数据类型
Pig拥有丰富的数据类型,主要可以分为两大类:基本类型和复杂类型。
针对复杂数据类型举例说明如下。
-
元组:字段或属性值的集合。例如:
(OH, Mark, Twain,31225) -
包:元组的无序集合,大括号内元组之间用逗号分隔。例如:
{ (OH,Mark,Twain,31225), (UK,Charles,Dickens,42207), (ME,Robert,Frost,11496) } -
映射:键值对的集合,中括号内,键与值之间以#分隔(#是系统默认,不可更改),键值对之间用逗号分隔。例如:
3、Pig与Hive比较
Pig与Hive基于其特性对比
-
语言:两者都有对应的操作语言,编写的程序最后都转换为MapReduce程序运行。
-
表概念:Hive中有一个“表”的概念,但Pig中没有表的概念。
-
远程服务:Hive可以依托于Thrift启动一个远程服务,提供远程调用;Pig中没有这样的功能。
-
自定义函数:两者都提供UDF,可根据用户需求来自定义函数。
-
Shell命令行:都有其对应的Shell命令行,而且Pig可以直接执行ls、cat这样的命令,但Hive不支持这样使用。
-
Web访问接口:Hive支持通过浏览器访问,可以在Web页面中编写HiveQL语句;Pig不支持Web访问。
-
JDBC/ODBC:Hive可以通过JDBC/ODBC远程访问Hive,远程需要启动HiveServer2服务;Pig不支持远程调用。
Pig Latin是面向数据流的编程语言,而HiveQL是一种描述型编程语言,二者最大的区别在于对作业执行方式的控制粒度不同。
同样一个任务,HiveQL只需定义要执行的操作即可,HiveQL查询规划器会负责安排HiveQL命令的执行顺序等。而Pig Latin类似于直接在查询规划器这一层操作数据,因此需要用户自己一步一步地根据数据流的处理方式来编程,即用户要设计数据流的每一个步骤。
Hive和Pig的选用最终取决于用户需求,如果用户更希望使用熟悉的SQL接口操作数据,很明显应当选用Hive。但如果有专门人员以数据流水线的方式考虑问题,并需要对作业运行方式进行更细粒度的控制,那么Pig可能会是一个更好的选择。
4、Pig的运行模式
有本地模式(Local模式)和MapReduce模式,每种运行模式都有3种运行方式,分别为:Grunt Shell方式、脚本文件方式、嵌入式程序方式。下面将对运行模式及方式进行介绍。
4.1.本地模式
本地运行模式下,Pig运行在单个JVM中,访问本地文件系统,该模式用于测试或处理小规模数据集。
(1)Grunt Shell方式Grunt Shell和Windows中的DOS窗口非常类似,在这里用户可以一条一条地输入命令对数据进行操作,启动命令如下所示。
pig -x local(2)脚本文件方式使用脚本文件作为批处理作业来运行Pig命令,它实际上是第一种运行方式中命令的集合,使用如下命令可以运行Pig脚本。
pig -x local script.pig其中,script.pig是对应的Pig脚本,用户在这里需要正确指定Pig脚本的位置,否则,系统将不能识别。例如,Pig脚本放在“/root/pig”目录下,那么这里就要写成“/root/pig/script.pig”。
(3)嵌入式程序方式比如把Pig命令嵌入Java语言中,通过运行这个嵌入式程序来执行Pig命令。首先需要编写特定的Java程序(主要用到PigServer类),并且将其编译生成对应的class文件或package包,然后再调用main函数运行程序。关于嵌入式程序方式,本书不做过多介绍,读者可自行搜索相关资料。
4.2.MapReduce模式
在MapReduce运行模式下,Pig访问HDFS,并将查询翻译为MapReduce任务提交到Hadoop集群中进行处理。
(1)Grunt Shell方式
与本地模式中脚本文件方式类似,区别在于执行命令不同,MapReduce模式下的执行命令如下所示。
pig或pig -x mapreduce(2)脚本文件方式与本地模式中脚本文件方式类似,区别在于执行命令不同,MapReduce模式下的执行命令如下所示。
pig script.pig或pig -x mapreduce script.pig其中,script.pig是对应的Pig脚本,用户在这里也需要正确指定Pig脚本的位置,否则,系统将不能识别。
(3)嵌入式程序方式与本地模式下的嵌入式程序方式类似,区别在于MapReduce模式下操作的是HDFS中的数据,任务的执行是在Hadoop集群之上。
5 、常用Pig Latin操作
Pig命令可以分为两大类:数据加载存储和数据转换。数据加载使用LOAD命令,加载数据可从本地或HDFS。存储使用STORE命令,数据可存储到本地或HDFS,STORE命令可触发编译器,将查询的逻辑计划编译为物理计划,DUMP命令也有此功能。
(1)LODA导入数据
D=LOAD 'mydata_d.txt' AS( id: chararray, name: chararray, age: int, salary: double, states: bag {t: tuple(state1: chararray, state2: chararray)} ); #DUMP语句的作用是输出关系到控制台 DUMP A;(2)数据存储命令:STORE
#使用USING PigStorage(', ')指定存储的数据分隔符为逗号。 STORE C INTO 'C'USING PigStorage(','); #使用USING JsonStorage()指定存储的数据为json类型,例如这数据id:1,name:Tom,age:21,salary:2000 STORE C INTO 'C'USING JsonStorage();6、Pig参数替换
#以下myscript.pig脚本 E=LOAD '$input' USING PigStorage(',') As (id: chararray,n ame: chararray, age: int, salary: double); SET job.name ' test_script'; STORE E INTO' $output' USING PigStorage'\t');LOAD加载数据input到关系E,SETjob.name命令设置任务名称为testscript,STORE命令存储关系E到input到关系E, SET job.name命令设置任务名称为test_script,STORE命令存储关系E到input到关系E,SETjob.name命令设置任务名称为testscript,STORE命令存储关系E到output目录。其中input、input、input、output是变量,分别对应输入数据和存储目录,需要在执行脚本时为变量赋值。执行myscript.pig脚本有如下两种方式:
1)使用-p参数为脚本中变量赋值。
pig-x local -p input=mydata_c.txt-p output=script_out myscript.pig其中,输入数据使用pig/data/mydata_c.txt,输出目录为script_out。
2)使用-param_file参数指定参数文件myscript.params。
pig-param_file myscript.params myscript.pig其中myscript.params文件内容如下所示:
input=mydata_c.txt output=script_out7、数据转换
7.1、分组命令GROUP
GROUP 关系名 BY(字段1,字段2,···) GROUP 关系名 ALL;7.2、过滤命令FILTER
filter 关系名 BY 表达式 #l例如以下写法 FA=FILTER salaries BY salary >=10000.0; FB=FILTER salaries BY gender=='F' AND age 〉=50; FC=FILTER salaries BY NOT gender MATCHES 'F';7.3、帅选命令LIMIT
#LIMIT语法如下: LIMIT 关系名 数值 #例如,基于代码清单5-1创建的关系salaries,使用LIMIT命令创建关系,命令如下: salaries limit=LIMIT salaries 3;7.4、去重命令DISTINCT
#DISTINCT语法如下: DISTINCT 关系名; #例如,基于代码清单5-1创建的关系salaries,使用LIMIT命令创建关系,命令如下: unique_salaries=DISTINCT salaries;7.5、排序命令ORDER BY
#ORDER BY语法如下: ORDER 关系名 BY 表达式 #例如,基于代码清单5-1创建的关系salaries,使用ORDER BY命令创建关系,命令如下所示: orderbyage=ORDER salaries BY age ASC;orderbyage_salary=ORDER salaries BY age ASC,salary DESC;7.6、遍历命令FOREACH
#FOREACH语法如下: FOREACH 关系名 GENERATE 表达式 A=FOREACH salaries GENERATE gender, age, salary; A1=FOREACH salaries GENERATE.. salary; B=FOREACH salaries GENERATE age.. zip; B1=FOREACH salaries GENERATE age..; C=FOREACH salaries GENERATE salary, salary * 0.07 AS bonus; salariesbygender=GROUP salaries BY gender; group_count=FOREACH salariesbygender GENERATE group, COUNT(salarie s) AS salaries count;7.7、嵌套FOREACH
#嵌套FOREACH语法如下: *FOREACH关系名{ 关系名1 = 命令表达式; 关系名2 = 命令表达式; GENERATE表达式; }; #嵌套FOREACH一般配合分组使用,其中中为子句,子句一般是对组进行的操作。 gender_grp=GROUP salaries BY gender; unique_ages=FOREACH gender_grp{ ages=gender_grp. age; unique_age=DISTINCT ages; GENERATE group, COUNT(unique_age);7.8、分支命令CASE
#CASE语法如下: FOREACH 关系名 GENERATE 字段名, (CASE WHEN 表达式1 THEN 表达式或字段名WHEN 表达式1 THEN 表达式或字段名 END)AS字段名;#例子 bonuses=FOREACH salaries GENERATE salary,( CASE WHEN salary 〉=70000.00 THEN salary *0.10 WHEN salary<70000.00 AND salary 〉=30000.0 THEN salary * 0.05 WHEN salary〈=30000.0 THEN 0.0 END) AS bonus;7.9、扁平命令FLATTEN
#FLATTEN语法如下: FLATTEN(关系名)7.10、连接命令JOIN
##(1)内连接 #语法如下: 关系3=J0IN 关系1 BY key1,关系2BY key2; #(2)外连接 #外连接包括全连接、左连接、右连接3种连接方式。 #外连接语法如下: 关系3=J0IN 关系1 BY key1 [FULL|LEFT|RIGHT] OUTER,关系2 BY key2; #例子 outerjoin=JOIN loc BY firstname FULL OUTER,dep BY firstname; leftjoin=JOIN loc BY firstname LEFT OUTER,dep BY firstname; rightjoin=JOIN loc BY firstname RIGHT OUTER,dep BY firstname;总结
- 上一篇: 榆熙教育有限公司:拼多多商家应该了解的常
- 下一篇: 多字体文件合并处理