Pig

一、Pig的介绍:

Pig由Yahoo开发,主要应用于数据分析,Twitter公司大量使用Pig处理海量数据,Pig之所以是数据分析引擎,是因为Pig相当于一个翻译器,将PigLatin语句翻译成MapReduce程序(只有在执行dump和store命令时才会翻译成MapReduce程序),而PigLatin语句是一种用于处理大规模数据的脚本语言。

二、Pig与Hive的相同与区别:

相同:

1、Hive和Pig都是数据分析引擎,除此之外,还有Spark中的Spark SQL和Cloudera开发的Impala等。

2、Hive和Pig都简化了MapReduce程序的开发。

不同:

1、Hive作为数据分析引擎有一定限制,只能分析结构化数据,因为Hive的数据模型是表结构,虽然没有数据存储引擎,需要用户在创建表时指定分隔符(默认以Tab键作为分隔符):row format delimited field terminated by ‘,’,而Pig的数据模型是包结构,由tuple和field组成,因此可以分析任意类型的数据。

2、Hive使用的是sql语句分析数据,sql语句是一种声明式语言,Pig使用的是PigLatin语句分析数据,PigLatin语句是一种过程式语言/脚本语句。

3、Hive中的内置函数不用大写,Pig中的内置函数必须要大写。

举例:按照部门号对员工表分组并求每个部门中薪水的最大值:

sql语句:select deptno,max(sal) from emp group by deptno;

PigLatin语句:emp1 = group emp by deptno;

emp2 = foreach emp1 generate group,MAX(emp.sal)

dump emp2;

(PigLatin语句注意事项:等号前后要有空格)

4、Hive保存元信息,因此数据模型不用重建,而Pig不保存元信息,因此数据模型需要重建。

5、由于PigLatin语句是脚本语言,因此Hive执行速度比Pig更快。

6、 由于Hive的数据模型是表结构,因此Hive是先创建表,后加载数据,而Pig的数据模型是包结构,Pig在加载数据的同时创建包。

举例:创建一份员工表

sql语句:

1、创建表:

create table emp(

empno int,

ename string,

job string,

mgr int,

hiredate string,

sal int,

comm int,

deptno int

)row format delimited field terminated by ',';

2、加载HDFS中的数据:

load data inpath '/scott/emp.csv' into table emp;

PigLatin语句:

加载数据的同时创建包:load后加载数据,using后指定分隔符,as后指定包结构

emp=load'/scott/emp.csv'usingPigStorage(',')as(empno:int,ename:chararray,job:chararray,mgr:int,hiredate:chararray,sal:int,comm:int,deptno:int);

三、Hive数据模型和Pig数据模型的差别:

1、Hive的数据模型是表,表由行和列组成,表不可以嵌套,Pig的数据模型是包,包由tuple和field组成,包可以嵌套。

2、表中每一行的列完全相同,包中每一行的列可以不相同,可以动态增加。

四、Pig的安装和配置:

1、安装pig:tar -zxvf pig-0.17.0.tar.gz -C ~/traing

2、配置PIG_HOME环境变量:

export PIG_HOME=/root/training/pig-0.17.0

export PATH=$PIG_HOME/bin:$PATH

五、Pig的安装模式:

1、本地模式:访问本地主机,pig相当于本地的客户端。

2、集群模式:访问Hadoop集群,pig相当于Hadoop的客户端。

注:1、集群模式需要配置PIG_CLASSPATH环境变量,用于连接到Hadoop上:

export PIG_CLASSPATH=/root/training/hadoop-2.7.3/etc/hadoop

2、启动pig的集群模式前,需要先启动historyserver,因为pig在hadoop上执行任务后需要与historyserver通信,解析执行日志确定任务执行是否成功:

mr-jobhistory-daemon.sh start historyserver

六、Pig的常用命令:操作HDFS

ls、cd、cat、mkdir、pwd、copyFromLocal(上传)、copyToLocal(下载)、register、define等。

七、操作Pig:

1、命令行:pig提供了一个shell终端与用户进行交互,用户可以进行增删改查操作。

启动pig命令行模式,进入本地模式:pig -x local

启动pig命令行模式,进入集群模式:pig - x mapredcue/pig

(pig没有API可以操作)

八、常用的PigLatin语句:

load:加载数据

foreach:逐行扫描

generate:提取列

filter:过滤

distinct:去重

order by:排序

group by:分组

join:多表查询

union:联合查询

dump:把结果输出到屏幕上

store:把结果保存到HDFS上

九、使用PigLatin语句分析数据:

创建员工表:load后加载数据,using后指定分隔符,as后指定包结构

emp = load '/scott/emp.csv' using PigStorage(',') as(empno:int,ename:chararray,job:chararray,mgr:int,hiredate:chararray,sal:int,comm:int,deptno:int);

describe emp;

查看员工表:2

SQL:select * from emp;

PL:emp0 = foreach emp generate *;

dump emp0;

创建部门表:

dept = load '/scott/dept.csv' using PigStorage(',') as(deptno:int,dname:chararray,loc:chararray);

查看部门表:

SQL:select * from dept;

PL:dept0 = foreach dept generate *;

dump dept0;

查询员工号、员工名和薪水:

SQL:select empno,ename,sal from emp;

PL:emp1 = foreach emp generate empno,ename,sal;

dump emp1;

根据薪水对员工表排序:

SQL:select sal from emp order by sal;

PL:emp2 = order emp by sal;

dump emp2;

按照部门号对员工表分组并求每个部门中薪水的最大值:

SQL:select deptno,max(sal) from emp group by deptno;

PL:emp3 = group emp by deptno;

emp4 = foreach emp3 generate group,MAX(emp.sal);

dump emp4;

查看10、20、30号部门的员工

SQL:select * from emp where deptno=10;

select * from emp where deptno=20;

select * from emp where deptno=30;

PL:emp5 = filter emp by deptno==10;

dump emp5;

emp6 = filter emp by deptno==20;

dump emp6;

emp7 = filter emp by deptno==30;

dump emp7;

多表查询,查询员工名和部门名:

SQL:select emp.ename,dept.dname from emp,dept where emp.deptno=dept.deptno;

PL:emp8 = join emp by deptno,dept by deptno

emp9 = foreach emp8 generate emp::ename,dept::dname;

dump emp9;

内连接:

C = join A by id,B by id;

外连接:

左外连接:C = join A by id left outer,B by id; #以左侧数据为基准,只返回左侧有的数据

右外连接:C = join A by id right outer,B by id;#以右侧数据为基准,只返回右侧有的数据

全外连接:C = join A by id full outer, B by id;#两侧数据都返回

联合查询,查询10号部门和20号部门的员工:

SQL:select * from emp where deptno=10

union

select * from dept where deptno=20;

PL: emp10 = filter emp by deptno==10;

emp11 = filter emp by deptno==20;

emp12 = union emp10,emp11;

实现wordcount;

加载数据

mydata = load '/output/data2.txt' as (line:chararray);

将字符串分割成单词

words = foreach mydata generate flatten(TOKENIZE(line)) as word;

对单词分组

grpd = group words by word;

统计每组中单词数量

cntd = foreach grpd generate group,COUNT(words);

结果显示到屏幕上

dump cntd;

结果存储到HDFS上

store cntd into '/pig';

常用的大数据工具

作者:李金泽AlllenLI,清华大学硕士研究生,研究方向:大数据和人工智能

详细解读大数据分析引擎Pig&PigLatin语句的更多相关文章

  1. 《开源大数据分析引擎Impala实战》目录

    当当网图书信息: http://product.dangdang.com/23648533.html <开源大数据分析引擎Impala实战>目录 第1章  Impala概述.安装与配置.. ...

  2. 大数据分析引擎Apache Flink

    Apache Flink是一个高效.分布式.基于Java实现的通用大数据分析引擎,它具有分布式 MapReduce一类平台的高效性.灵活性和扩展性以及并行数据库查询优化方案,它支持批量和基于流的数据分 ...

  3. Impala:新一代开源大数据分析引擎--转载

    原文地址:http://www.parallellabs.com/2013/08/25/impala-big-data-analytics/ 文 / 耿益锋 陈冠诚 大数据处理是云计算中非常重要的问题 ...

  4. Impala:新一代开源大数据分析引擎

    Impala架构分析 Impala是Cloudera公司主导开发的新型查询系统,它提供SQL语义,能查询存储在Hadoop的HDFS和HBase中的PB级大数据.已有的Hive系统虽然也提供了SQL语 ...

  5. Spark入门,概述,部署,以及学习(Spark是一种快速、通用、可扩展的大数据分析引擎)

    1:Spark的官方网址:http://spark.apache.org/ Spark生态系统已经发展成为一个包含多个子项目的集合,其中包含SparkSQL.Spark Streaming.Graph ...

  6. Esri大数据分析引擎GeoAnalytics Server部署经历

    系统架构 Base WebGIS 4Cores 16GB Spatiotemporal Data Store 32GB SSD Disk 足够大的空间 GA Server 4Cores 16GB 足够 ...

  7. 《基于Apache Kylin构建大数据分析平台》

    Kyligence联合创始人兼CEO,Apache Kylin项目管理委员会主席(PMC Chair)韩卿 武汉市云升科技发展有限公司董事长,<智慧城市-大数据.物联网和云计算之应用>作者 ...

  8. 【转】使用Apache Kylin搭建企业级开源大数据分析平台

    http://www.thebigdata.cn/JieJueFangAn/30143.html 本篇文章整理自史少锋4月23日在『1024大数据技术峰会』上的分享实录:使用Apache Kylin搭 ...

  9. 使用Apache Kylin搭建企业级开源大数据分析平台

    转:http://www.thebigdata.cn/JieJueFangAn/30143.html 我先做一个简单介绍我叫史少锋,我曾经在IBM.eBay做过大数据.云架构的开发,现在是Kylige ...

随机推荐

  1. SAP FI/CO 基本概念

    每一个SAP从业者都对这些概念不陌生,理解透了这些概念,对SAP的业务体系构架才能有明确地认识. 1.集团(client)的概念:是SAP中的最高等级:每一个集团建立主数据库. 2.公司(Compan ...

  2. 新飞电器的BI建设案例

    一.河南新飞电器简介 河南新飞电器在制造行业内属于领先地位,其信息化程度较高,面对系统多且杂乱的情况,一个集中展示数据的平台就显得尤为重要.使用BI就是为了在一个相对统一的平台展示需要查看的数据,供决 ...

  3. memset初始化数组的问题

    今天才搞清楚,memset用于初始化数组,仅能初始化为0值,而不能初始化一个特定的值,这怎么能模糊了呢??? 因此,如果对申请的一段存放数组的内存进行初始化,每个数组元素均初始化为特定的值,必须使用循 ...

  4. Java学习笔记之异常处理

    一.异常的分类 1.由Java虚拟机抛出的异常(Error):程序无法处理的问题,用户不用去进行处理(虚拟机错误丶内存溢出错误丶线程死锁) 2.Exception异常:程序本身可以进行处理的异常 1. ...

  5. Linux —— Vi 命令介绍

    简介 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器. 这里只是简单地介绍一下它的用法和一小部分指令. 由于对Unix及Linux系统的任何版本,vi编辑 ...

  6. 8.1、包,__init__.py,

    包: 为了组织好模块,将多个模块组合为一个包,所以包用于存放python模块 包通常是一个文件夹,当文件夹当作包使用时,文件夹需要包含__init__.py文件 __init__.py的内容可以为空, ...

  7. .NET笔试题集(四)

    转载于:http://www.cnblogs.com/ForEvErNoME/archive/2012/09/10/2678727.html 1.请你简单的说明数据库建立索引的优缺点 使用索引可以加快 ...

  8. 使用 Azure 门户创建 Windows 虚拟机

    可以通过 Azure 门户创建 Azure 虚拟机. 此方法提供一个基于浏览器的用户界面,用于创建和配置虚拟机和所有相关的资源. 本快速入门介绍了如何创建虚拟机并在 VM 上安装 webserver. ...

  9. Oracle EBS OM 发放订单

    DECLARE l_header_rec OE_ORDER_PUB.Header_Rec_Type; l_line_tbl OE_ORDER_PUB.Line_Tbl_Type; l_action_r ...

  10. mysql INSERT的几个语法 IGNORE|REPLACE|LOW_PRIORITY | DELAYED

    INSERT IGNORE 与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据.这样就可以保留 ...