【大数据离线开发】9 Pig:数据分析引擎

news2024/9/22 9:48:18

文章目录

    • Pig:数据分析引擎
      • 9.1 什么是Pig
        • 9.1.1 简介
        • 9.1.2 与 Hive 的对比
      • 9.2 Pig的体系结构和数据模型
      • 9.3 Pig的安装和工作模式
        • 9.3.1 Pig安装
        • 9.3.2 Pig工作模式
      • 9.4 Pig的内置函数
      • 9.5 使用PigLatin语句分析数据
      • 9.6 Pig的自定义函数
        • 9.6.1 自定义过滤和运算函数
        • 9.6.2 自定义加载函数

Pig:数据分析引擎

9.1 什么是Pig

9.1.1 简介

Pig是一个基于Apache Hadoop的大规模数据分析平台,它提供的SQL-LIKE语言叫PigLatin,该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算。Pig为复杂的海量数据并行计算提供了一个简单的操作和编程接口,使用者可以透过Python或者JavaScript编写Java,之后再重新转写。

Pig的特点

  • Pig是一个用来处理大规模数据集的平台,由Yahoo!贡献给Apache

  • Pig可以简化MapReduce任务的开发

  • Pig可以看做hadoop的客户端软件,可以连接到hadoop集群迕行数据分析工作

  • Pig方便不熟悉java的用户,使用一种较为简便的类似二SQL的面向数据流的语言pig Latin迕行数据处理

  • PigLatin可以迕行排序、过滤、求和、分组、关联等常用操作,迓可以自定义凼数,返是一种面向数据分析处理的轻量级脚本语言

  • Pig可以看做是PigLatin到MapReduce的映射器

  • Pig可以自动对集群进行分配和回收,自动地对MapReduce程序进行优化

9.1.2 与 Hive 的对比

Pig与Hive作为一种高级数据语言,均运行于HDFS之上,是hadoop上层的衍生架构,用于简化hadoop任务,并对MapReduce进行一个更高层次的封装。Pig与Hive的区别如下:

  • Pig是一种面向过程的数据流语言;Hive是一种数据仓库语言,并提供了完整的sql查询功能。
  • Pig更轻量级,执行效率更快,适用于实时分析;Hive适用于离线数据分析。
  • Hive查询语言为Hql,支持分区;Pig查询语言为Pig Latin,不支持分区。
  • Hive支持JDBC/ODBC;Pig不支持JDBC/ODBC。
  • Pig适用于半结构化数据(如:日志文件);Hive适用于结构化数据。

9.2 Pig的体系结构和数据模型

为了使用Pig执行特定任务,程序员需要使用Pig Latin语言编写Pig脚本,并使用任何执行机制(Grunt Shell,UDF,嵌入式)执行它们。执行后,这些脚本将经历Pig框架应用的一系列转换,以产生所需的输出。

在内部,Apache Pig将这些脚本转换为一系列MapReduce作业,因此使程序员的工作变得容易。Apache Pig的体系结构如下所示。

在这里插入图片描述

数据模型

在这里插入图片描述

9.3 Pig的安装和工作模式

9.3.1 Pig安装

首先将Pig的包上传到我的Linux目录当中,然后对文件进行解压安装

在这里插入图片描述

解压命令
tar -zxvf pig-0.17.0.tar.gz -C ~/training/

设置环境变量 vi ~/.bash_profile
PIG_HOME=/root/training/pig-0.17.0
export PIG_HOME
PATH=$PIG_HOME/bin:$PATH
export PATH
生效环境变量 source ~/.bash_profile

Pig的常用命令

  • ls、cd、cat、mkdir、pwd
  • copyFromLocal、copyToLocal
  • sh
  • register、define

9.3.2 Pig工作模式

本地模式:操作Linux的文件

启动: pig -x local

日志:Connecting to hadoop file system at: file:///

在这里插入图片描述

集群模式:链接到HDFS

设置环境变量PIG_CLASSPATH指向Hadoop配置文件所在的目录

注意:通过Pig操作HDFS的速度要快

设置环境变量 vi ~/.bash_profile
PIG_CLASSPATH=/root/training/hadoop-2.7.3/etc/hadoop
export PIG_CLASSPATH
生效环境变量 source ~/.bash_profile

启动: pig

日志: Connecting to hadoop file system at: hdfs://bigdata111:9000

在这里插入图片描述

9.4 Pig的内置函数

计算函数

函数名称函数作用
avg计算包中项的平均值
concat把两个字节数组或者字符数组连接成一个
count计算包中非空值的个数
count_star计算包中项的个数,包括空值
diff计算两个包的差
max计算包中项的最大值
min计算包中项的最小值
size计算一个类型的大小,数值型的大小为1; 对于字符数组,返回字符的个数; 对于字节数组,返回字节的个数; 对于元组,包,映射,返回其中项的个数。
sum计算一个包中项的值的总和
TOKENIZE对一个字符数组进行标记解析,并把结果词放入一个包

过滤函数

函数名称函数作用
isempty判断一个包或映射是否为空

加载存储函数

函数名称函数作用
PigStorage用字段分隔文本格式加载或存储关系,这是默认的存储函数
BinStorage从二进制文件加载一个关系或者把关系存储到二进制文件
BinaryStorage从二进制文件加载只是包含一个类型为bytearray的字段的元组到关系,或以这种格式存储一个关系
TextLoader从纯文本格式加载一个关系
PigDump用元组的tostring()形式存储关系

9.5 使用PigLatin语句分析数据

注意:类似Spark RDD的算子(方法、函数)

​ Spark的算子有两种类型:

  1. Transformation:不会触发计算
  2. Action:会触发计算

注意:启动Yarn的history server

  1. 首先需要使用Hadoop的HistoryServer,前提要启动hadoop环境

    • 命令:mr-jobhistory-daemon.sh start historyserver

    • 网页:http://192.168.157.111:19888/jobhistory(包含所有的HDFS操作)

  1. 常用的PigLatin语句:有的会触发计算,有的不会

    名称作用Spark对应语句
    load加载数据到bag(表)
    foreach相当于循环,对bag每一条数据tuple进行处理RDD.foeach
    filter过滤:相当于whereRDD.filter
    group by分组也有
    join连接操作也有
    generate提取列
    union/intersect集合运算
    dump输出:直接打印的屏幕上
    store输出: 输出到文件

  2. 举例:数据(员工表、部门表)

    7654,MARTIN,SALESMAN,7698,1981/9/28,1250,1400,30

(1) 加载员工数据到表
	emp = load '/scott/emp.csv';
	查询表的结构
	describe emp;  ---> Schema for emp unknown.
	
(2) 加载员工数据到表,指定每个tuple的结构和类型
	emp = load '/scott/emp.csv' as(empno,ename,job,mgr,hiredate,sal,comm,deptno);
	默认的数据类型:bytearray
	默认分隔符:制表符
	
    emp = load '/scott/emp.csv' as(empno:int,ename:chararray,job:chararray,mgr:int,hiredate:chararray,sal:int,comm:int,deptno:int);
	
	emp = load '/scott/emp.csv' using PigStorage(',') as(empno:int,ename:chararray,job:chararray,mgr:int,hiredate:chararray,sal:int,comm:int,deptno:int);
	
	创建一个部门表
	dept = load '/scott/dept.csv' using PigStorage(',') as(deptno:int,dname:chararray,loc:chararray);
	
(3) 查询员工信息:员工号 姓名  薪水
	SQL: select empno,ename,sal from emp;
	PL:  emp3 = foreach emp generate empno,ename,sal;
	
(4) 查询员工信息:按照月薪排序
	SQL: select * from emp order by sal;
	PL:  emp4 = order emp by sal;
	
(5) 分组:求每个部门的工资的最大值
	SQL:  select deptno,max(sal) from emp group by deptno;
	PL:   第一步:分组
		  emp51 = group emp by deptno;
		  表结构:
		  emp51: {group: int,
                  emp: {(empno: int,ename: chararray,job: chararray,mgr: int,hiredate: chararray,sal: int,comm: int,deptno: int)}}
		  
		  数据:
		  (10,{(7934,MILLER,CLERK,7782,1982/1/23,1300,,10),
			   (7839,KING,PRESIDENT,,1981/11/17,5000,,10),
			   (7782,CLARK,MANAGER,7839,1981/6/9,2450,,10)})
			   
		  (20,{(7876,ADAMS,CLERK,7788,1987/5/23,1100,,20),
			   (7788,SCOTT,ANALYST,7566,1987/4/19,3000,,20),
			   (7369,SMITH,CLERK,7902,1980/12/17,800,,20),
			   (7566,JONES,MANAGER,7839,1981/4/2,2975,,20),
			   (7902,FORD,ANALYST,7566,1981/12/3,3000,,20)})
			   
		  (30,{(7844,TURNER,SALESMAN,7698,1981/9/8,1500,0,30),
			   (7499,ALLEN,SALESMAN,7698,1981/2/20,1600,300,30),
			   (7698,BLAKE,MANAGER,7839,1981/5/1,2850,,30),
			   (7654,MARTIN,SALESMAN,7698,1981/9/28,1250,1400,30),
			   (7521,WARD,SALESMAN,7698,1981/2/22,1250,500,30),
			   (7900,JAMES,CLERK,7698,1981/12/3,950,,30)})
		  
		  第二步:求每个部门的工资最大值
			  emp52 = foreach emp51 generate group,MAX(emp.sal)
	
	(6) 查询10号部门的员工
		SQL:  select * from emp where deptno=10;
		PL:   emp6 = filter emp by deptno==10;  注意:两个等号
		
	(7) 多表查询
		查询员工信息: 员工姓名 部门名称
		SQL:  select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno;
		PL:   emp71 = join dept by deptno,emp by deptno;
			  emp72 = foreach emp71 generate dept::dname,emp::ename;
			  
	(8) 集合运算:关系型数据库Oracle:参与集合运算的各个集合必须列数相同且类型一致
		 1020号部门的员工
		 SQL: select * from emp where deptno=10
			  union
			  select * from emp where deptno=20;
			  
		PL: emp10 = filter emp by deptno==10;
			emp20 = filter emp by deptno==20;
			emp10_20 = union emp10,emp20;
			
	(9) 使用PL实现WordCount
		① 加载数据 
		mydata = load '/data/data.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;	
        
注意:PigLatin中,bag具有依赖关系
	  Spark中,RDD也具有依赖关系(宽依赖、窄依赖)

在这里插入图片描述

9.6 Pig的自定义函数

Pig的自定义函数有三种:

  1. 自定义过滤函数:相当于where条件

  2. 自定义运算函数:

  3. 自定义加载函数:使用load语句加载数据,生成一个bag

    默认:load语句加载数据,一行解析成一个Tuple

    需要MR的jar包

9.6.1 自定义过滤和运算函数

依赖的jar包

1、/root/training/pig-0.17.0/pig-0.17.0-core-h2.jar

2、/root/training/pig-0.17.0/lib

3、/root/training/pig-0.17.0/lib/h2

4、$HADOOP_HOME/share/hadoop/common

5、$HADOOP_HOME/share/hadoop/common/lib

自定义过滤函数IsSalaryTooHigh

//实现自定义的过滤函数:实现:查询过滤薪水大于2000的员工
public class IsSalaryTooHigh extends FilterFunc{

	@Override
	public Boolean exec(Tuple tuple) throws IOException {
		/*参数tuple,调用的时候 传递的参数
		 * 
		 * 在PigLatin调用:
		 * myresult1 = filter emp by demo.pig.IsSalaryTooHigh(sal)
		 */
		//取出薪水
		int sal = (int) tuple.get(0);
		return sal>2000?true:false;
	}

}

自定义过滤函数CheckSalaryGrade

//根据员工的薪水,判断级别
//泛型:经过运算后,结果的类型
public class CheckSalaryGrade extends EvalFunc<String>{

	@Override
	public String exec(Tuple tuple) throws IOException {
		// 调用: myresult2 = foreach emp generate ename,sal,demo.pig.CheckSalaryGrade(sal);
		
		int sal = (int)tuple.get(0);
		if(sal<1000) return "Grade A";
		else if(sal>=1000 && sal<3000) return "Grade B";
		else return "Grade C";
	}

}

然后将部署的java代码打包成jar包,上传到Linux服务器上,进行注册执行

  • 注册jar包 register /root/temp/pig.jar

  • 为自定义函数起别名(可选):define myfilter demo.pig.MyFilterFunction;

  • 用法1:result1 = filter emp by demo.pig.IsSalaryTooHigh(sal)

  • 用法2:result2 = foreach emp generate ename,demo.pig.CheckSalaryGrade(sal);

在这里插入图片描述

在这里插入图片描述

9.6.2 自定义加载函数

  • 默认情况下,load语句加载数据,一行解析成一个Tuple

    比如:员工信息

在这里插入图片描述

  • 特殊情况:单词统计的时候。这时候:希望每个单词能被解析成一个Tuple,从而便于处理

在这里插入图片描述

  • 需要MapReduce的 jar 包(参考之前下载MapReduce的jar选择)

在这里插入图片描述

自定义加载函数MyLoadFunc

/*
 * 自定义的加载函数:
 * 实现:WordCount钱加载数据,每一个单词作为一个Tuple
 */
public class MyLoadFunc extends LoadFunc{

	//定义一个变量保存输入流
	private RecordReader reader ;
	
	@Override
	public InputFormat getInputFormat() throws IOException {
		// 输入数据的格式:字符串
		return new TextInputFormat();
	}

	@Override
	public Tuple getNext() throws IOException {
		// 从输入流中读取一行,如何解析生成返回的tuple
		//数据: I love Beijing
		Tuple result = null;
		try{
			//判断是否读入了数据
			if(!this.reader.nextKeyValue()){
				//没有数据
				return result; //----> 是null值
			}
			
			//数据数据: I love Beijing
			String data = this.reader.getCurrentValue().toString();
			
			//生成返回的结果:Tuple
			result = TupleFactory.getInstance().newTuple();
			
			//分词
			String[] words = data.split(" ");
			
			//每一个单词单独生成一个tuple(s),再把这些tuple放入一个bag中。
			//在把这个bag放入result中
			//创建一个表
			DataBag bag = BagFactory.getInstance().newDefaultBag();
			for(String w:words){
				//为每个单词生成tuple
				Tuple aTuple = TupleFactory.getInstance().newTuple();
				aTuple.append(w); //将单词放入tuple
				
				//再把这些tuple放入一个bag中
				bag.add(aTuple);
			}
			
			//在把这个bag放入result中
			result.append(bag);
			
		}catch(Exception ex){
			ex.printStackTrace();
		}
		
		return result;
	}

	@Override
	public void prepareToRead(RecordReader reader, PigSplit arg1) throws IOException {
		// 使用该方法,初始化输入流
        // RecordReader reader: 代表HDFS的输入流
		this.reader = reader;
	}

	@Override
	public void setLocation(String path, Job job) throws IOException {
		// 从HDFS输入的路径(目录)
		FileInputFormat.setInputPaths(job, new Path(path));
	}

}

然后将部署的java代码打包成jar包,上传到Linux服务器上,进行注册执行

注册jar包: register /root/temp/p1.jar

myresult3 = load ‘/input/data.txt’ using demo.pig.MyLoadFunc();

定义别名(可选):define myload demo.pig.MyLoadFunc;

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/456498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

低资源环境下对风湿性心脏病的综合预测

文章目录 Ensembled Prediction of Rheumatic Heart Disease from Ungated Doppler Echocardiography Acquired in Low-Resource Settings摘要方法Echocardiogram Homogenization风湿性心脏病的检测 Ensembled Prediction of Rheumatic Heart Disease from Ungated Doppler Ech…

17、Logos使用摘要

本篇将讲述如何将WX的设置界面添加两个自定义的UI行: 包含是否启用某功能的开关,以及手速设置.并且如何定位到修改的代码.采用的是砸过壳的包. 成品也就是增加了两个UI及开关联动效果、 界面分析 如果我们要破解别人的App, 首先从界面UI入手,定位UI 1、使用class-dump导出全部…

分子共价对接(Covalent Docking)

共价对接&#xff08;Covalent Docking&#xff09; 随着人们对共价抑制剂的发现越来越重视&#xff0c;越来越多的软件开始支持共价抑制的虚拟筛选。常用的共价对接软件有CovDock&#xff0c;AutoDock4&#xff0c;FITTED&#xff0c;GOLD&#xff0c;ICM-Pro与MOE等。共价抑制…

断网了,还能ping通 127.0.0.1 吗?为什么?

你女神爱不爱你&#xff0c;你问她&#xff0c;她可能不会告诉你。 但网通不通&#xff0c;你 ping 一下就知道了。 可能看到标题&#xff0c;你就知道答案了&#xff0c;但是你了解背后的原因吗&#xff1f;那如果把 127.0.0.1 换成 0.0.0.0 或 localhost 会怎么样呢&#x…

易基因:ChIP-seq等揭示热休克转录因子A1b调控植物高温胁迫响应的分子机制|应激反应

在拟南芥中&#xff0c;热休克转录因子A1b&#xff08;HEAT SHOCK TRANSCRIPTION FACTORA1b&#xff0c;HSFA1b&#xff09;通过影响种子产量来调控对环境胁迫的抗性。HSFA1b是生殖适应性的决定性因素&#xff0c;这种调控机制怎么形成的呢&#xff1f; 2018年&#xff0c;英国…

基于静态分析结果的测试用例自动生成方法

自动生成用例的方法有多种&#xff0c;主要包括随机法、遗传算法、等价类划分法、约束求解法等。各种方法的适用范围、性能及生成的用例质量各不相同&#xff0c;具体见表1。从表1可以看出&#xff0c;约束求解法效率高&#xff0c;生成的用例质量也高&#xff0c;所以本项目中…

RabbitMQ-Topic(主题模式)

Topic topics 模式支持模糊匹配RoutingKey&#xff0c;就像是sql中的 like子句模糊查询&#xff0c;而路由模式等同于sql中的where子句等值查询 topic 交换机背后的路由算法类似于 direct 交换&#xff0c;使用特定路由键发送的消息将被传递到使用匹配绑定键绑定的所有队列。…

期权价格上下限与期权平价关系

目录 1. 期权的基本概念 2. 期权的上下限 3. 期权的平价关系 1. 期权的基本概念 期权&#xff1a;是一种选择权&#xff0c;期权买方向卖方支付一定数额的 期权费 后&#xff0c;可获得在 一定时间&#xff08;到期日&#xff09;内以 一定价格&#xff08;执行价格&#x…

如何使用 Java 将 JSON 文件读取为字符串?这三种方法很管用!

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff0c;它可以用来存储和传输结构化的数据。在 Java 中&#xff0c;有多种方法可以将 JSON 文件读取为字符串&#xff0c;本文将介绍其中的几种。 方法一&#xff1a;使用 java.io 包中的类 java.io 包中提…

【MySQL】索引和事务的详细介绍

目录 一.索引 1.索引概念 2.查看索引 3.创建索引 4.索引使用的数据结构是什么 1.HASH&#xff08;不是&#xff09; 2.二叉搜索树&#xff08;不是&#xff09; 3.B树 N叉数&#xff08;不是&#xff09; 4.B树&#xff08;是滴&#xff09; 5.组合索引 6.索引覆盖 7…

Docker Compose与Docker Swarm的简介和区别,以及docker swarm的简单使用命令

Docker Compose与Docker Swarm的简介和区别 背景Compose 简介Swarm 简介Compose 和 Swarm区别docker swarm简单使用及常用命令背景&#xff1a;初始化集群节点加入启动docker程序&#xff0c;nginx服务1.22版本查看服务服务伸缩删除service服务创建密钥secret查看secret使用sec…

清徐乡村e镇助力醋企惊艳亮相全国糖酒会

陈醋香醇悠悠&#xff0c;美味酸爽袭人。4月12日至14日&#xff0c;第108届全国糖酒商品交易会在成都举行&#xff0c;其间启动“山西老陈醋专业镇成都行”&#xff0c;208家山西醋企首次集中亮相交易会&#xff0c;为山西醋代言&#xff0c;由阿里云创新中心运营的清徐乡村e镇…

操作系统概述和体系结构

操作系统的概念和功能 核心&#xff1a;作为系统资源的管理者 向上提供方便易用的服务 联机就好比问一句答一句&#xff1b;脱机就好比先问好多句然后统一依次回答。 上面是直接提供给用户使用的。 另外还有一种程序接口&#xff1a; 这就是程序员在编程时经常调用的各种函数接…

【Linux】3、Linux 的编辑器

目录 一、vi 和 vim二、vim&#xff08;vi&#xff09;的三种工作模式(1) 命令模式快捷键(2) 底线命令模式操作 一、vi 和 vim &#x1f516; vim 和 vi 是 Linux 中经典的文本编辑器 &#x1f516; vim 是 vi 的加强版 &#x1f516; vim&#xff1a; ① 兼容 vi 的全部指令…

(数字图像处理MATLAB+Python)第五章图像增强-第六节:其他图像增强技术

文章目录 一&#xff1a;基于对数图像处理模型的图像增强&#xff08;1&#xff09;对数图像处理模型&#xff08;LIP&#xff09;&#xff08;2&#xff09;基于对数图像处理模型的增强 二&#xff1a;图像去雾增强&#xff08;1&#xff09;图像去雾模型&#xff08;2&#x…

Flutter 布局探索 | 如何分析尺寸和约束

theme: cyanosis 前言 本文来分享一下&#xff0c;通过查看源码和布局信息解决的一个实际中的布局小问题&#xff0c;也希望通过本文的分享&#xff0c;当你遇到布局问题时&#xff0c;可以靠自己的脑子和双手解决问题。 如下所示&#xff0c;将 TextField 作为 AppBar 组件的 …

java版本工程项目管理系统平台源码,助力工程企业实现数字化管理

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

重塑元宇宙体验!元宇宙实时云渲染解决方案来了

元宇宙作为人工智能、云计算和数字孪生等前沿技术的结合体&#xff0c;近年来越发受到各大企业重视。 元宇宙的应用场景层出不穷&#xff0c;不仅包括营销推广场景&#xff0c;还有品牌活动和电商销售&#xff0c;能有效提升品宣和商业转化效果。 元宇宙也具有极大的建设价值…

2.Spring Security详细使用

目录 1. Spring Security详细介绍 2. Spring Security详细使用 3. Spring Security实现JWT token验证 4. JWT&#xff08;JSON Web Token&#xff0c;JSON令牌&#xff09; 5. Spring Security安全注解 认证流程 1.集中式认证流程 &#xff08;1&#xff09;用户认证 使用…

【Unity入门】15.鼠标输入和键盘输入

【Unity入门】鼠标输入和键盘输入 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;监听鼠标输入 (1) Input类 Unity的Input类提供了许多监听用户输入的方法&#xff0c;比如我们常见的鼠标&a…