Apache Pig

目录

  • 一、配置说明
    • 1.本地模式
    • 2.集群模式
  • 二、pig的数据模型
  • 三、pig的数据类型
  • 四、惰性执行
  • 五、pig的基本语法
    • 5.1语法说明
    • 5.2案例操作
  • 六、pig的自定义函数

一、配置说明

1.本地模式

操作的是Linux系统文件

pig -x local

关键日志
在这里插入图片描述
当前处于root目录下
在这里插入图片描述

2.集群模式

连接的是HDFS
相较于本地模式需要新增一个环境变量,指向HDFS目录

PIG_CLASSPATH=$HADOOP_HOME/etc/hadoop
export PIG_CLASSPATH

启动

pig

关键日志
在这里插入图片描述

二、pig的数据模型

在这里插入图片描述

三、pig的数据类型

在这里插入图片描述

四、惰性执行

含义

Pig采用了惰性执行(lazy evaluation)的策略。惰性执行意味着Pig会尽可能推迟实际的数据处理操作,直到它认为必须执行这些操作为止。

惰性执行的原因

Pig之所以采用惰性执行,主要是为了优化性能和提高效率。通过推迟不必要的操作,Pig可以减少数据的读取、写入和传输次数,从而节省时间和资源。

触发操作

存储操作:当你使用STORE语句将关系的数据存储到文件系统或其他存储系统时,Pig会触发实际的数据处理操作。
DUMP操作:当你使用DUMP语句时,Pig会输出关系中的数据到控制台或指定的输出文件,这也会触发实际的操作。
需要中间结果的操作:在某些情况下,Pig可能需要中间结果来执行后续的操作(比如连接、分组等),这时它也会触发必要的数据处理。
显式调用执行:在某些Pig实现或上下文中,你可能可以显式地调用执行操作(比如通过API调用),但这通常不是Pig脚本的常规用法。

五、pig的基本语法

5.1语法说明

Pig Latin关系操作
在这里插入图片描述
Pig Latin的诊断操作
在这里插入图片描述
Pig Latin UDF语句
在这里插入图片描述

5.2案例操作

DUMP输出关系中的所有数据

dump emp;

Pig会将emp关系中的所有数据输出到控制台或指定的输出文件中。通常,这对于小数据集来说是有用的,但是对于大数据集来说,可能会产生大量的输出

DESC显示关系的模式,包括字段名、数据类型和是否允许为null

desc emp;

emp: {ename: chararray, deptno: int, sal: float}
这里,ename、deptno 和 sal 是emp关系中的字段名,chararray、int 和 float 是它们对应的数据类型。

加载到表

emp = LOAD '/scott/emp.csv' USING PigStorage(',') AS (empno: int, ename: chararray, job: chararray, mgr: int, hiredate: chararray, sal: int, comm: int, deptno: int);

LOAD 是正确的关键字,用于加载数据。
‘/scott/emp.csv’ 是文件路径,指定了要加载的CSV文件的位置。
USING PigStorage(‘,’) 指定了使用 PigStorage 函数,并以逗号(,)作为字段分隔符。注意,逗号和括号之间应该有空格。
AS (empno: int, ename: chararray, job: chararray, mgr: int, hiredate: chararray, sal: int, comm: int, deptno: int) 定义了关系 emp 中的字段名称和数据类型。每个字段名称和数据类型之间用冒号(:)分隔,并且整个 AS 子句用括号包围。

遍历

emp3 = foreach emp generate empno, ename, sal;

遍历emp关系中的每一行,并生成一个新的关系emp3,其中包含empno、ename和sal三个字段。

排序
排序操作可能会消耗大量的计算资源,特别是当关系非常大时

emp4 = order emp by deptno, sal;

emp4 关系中的元组会首先根据 deptno 字段进行排序,然后在每个相同的 deptno 值内,根据 sal 字段进行排序。

emp4 = order emp by sal DESC;

这些元组会根据 sal 字段的值进行排序。
默认情况下,排序是升序的(从小到大),此处增加DESC为降序

分组及组内操作
1.分组

emp51 = group emp by deptno;

这回创建一个新的关系 emp51,其中包含根据 deptno 字段分组的元组。每个组由一个唯一的 deptno 值和该值对应的所有元组组成。在Pig中,分组后的结果通常是一个包含两个字段的关系:一个用于分组的字段(在这个例子中是 deptno),另一个是一个包(bag),包含该组中的所有原始元组。
在这里插入图片描述

2.组内操作——求部门最高工资

emp52 = foreach emp51 generate group as deptno, MAX(emp.sal) as max_sal;

foreach语句用于遍历emp51中的每个元组(在这里,每个元组代表一个部门及其员工数据)。
generate语句用于生成新的字段。在这里,group字段被重命名为deptno,并且使用MAX函数计算包(bag)中emp.sal字段的最大值,结果命名为max_sal。
emp_max_sal:包含字段deptno和max_sal的新关系。每个deptno值对应一个max_sal值,表示该部门的最高薪资。

查询

emp6 = filter emp by deptno==10;

filter 语句用于根据一个或多个条件筛选关系中的元组。此语句用于从 emp 关系中筛选出 deptno 字段等于 10 的所有元组,并将结果存储在新的关系 emp6 中。

多表查询
1.表格连接

emp71 = join dept by deptno,emp by deptno

join语句用于根据一个或多个公共字段将两个或多个关系(relations)合并在一起。此语句根据deptno字段将dept关系和emp关系进行连接,并将结果存储在新的关系emp71中。
连接的字段只要数据类型相同,内容相同(逻辑上正确),名称允许不一样
如:emp71 = join dept by deptno,emp by departmentID 都是部门号

2.内容查询

emp72= foreach emp71 generate dept::dname ,emp::ename ;

从emp71关系中生成一个新的关系emp72,其中包含dept关系中的dname字段(部门名称)和emp关系中的ename字段(员工名称)。
dept::dname:这表示从dept关系中选择dname字段。在emp71关系中,由于dept和emp已经被连接,所以dept的字段可以通过dept::前缀来访问。
emp::ename:这表示从emp关系中选择ename字段。同样地,在emp71关系中,emp的字段可以通过emp::前缀来访问。

集合运算

-- 过滤出部门编号为10的员工  
emp10 = filter emp by deptno == 10;  -- 过滤出部门编号为20的员工  
emp20 = filter emp by deptno == 20;  -- 将两个过滤后的关系进行联合  
emp10_20 = union emp10, emp20;

emp10 = filter emp by deptno 10;:这行代码从 emp 关系中过滤出部门编号为10的员工,并将结果存储在 emp10 关系中。 emp20 = filter emp by deptno 20;:这行代码从 emp 关系中过滤出部门编号为20的员工,并将结果存储在 emp20 关系中。
emp10_20 = union emp10, emp20;:这行代码将 emp10 和 emp20 两个关系进行联合,生成一个新的关系 emp10_20。这个新关系将包含所有部门编号为10和20的员工。

六、pig的自定义函数

一般而言,pig的函数分为4种类型

  • 过滤函数
  • 计算函数
  • 加载函数
  • 存储函数

过滤函数

import org.apache.pig.FilterFunc;  
import org.apache.pig.data.Tuple;  
import java.io.IOException;  public class IsSalaryTooHigh extends FilterFunc {  @Override  public Boolean exec(Tuple tuple) throws IOException {  if (tuple == null || tuple.size() == 0) {  return false; // 如果tuple为空,返回false  }  // 获取当前员工的薪水,假设薪水字段为整数类型  Integer sal = (Integer) tuple.get(0); // 确保索引0对应的是薪水字段  // 判断薪水是否大于等于3000  return sal != null && sal >= 3000;  }  
}

继承自FilterFunc。FilterFunc是Apache Pig中的一个接口,用于定义过滤函数。
重写exec方法
Tuple
一个Tuple通常对应于表中的一行数据。一张表,它包含了多个Tuple,每个Tuple都代表了表中的一行。
Tuple中的索引通常是从0开始的,每个索引都对应了一个字段。
Tuple中的每个字段则对应了该行中的一个数据项。

计算函数

import org.apache.pig.EvalFunc;  
import org.apache.pig.data.Tuple;  
import java.io.IOException;  public class CheckSalaryGrade extends EvalFunc<String> {  @Override  public String exec(Tuple tuple) throws IOException {  // 获取员工薪水,假设薪水在tuple的第一个位置  int sal = (Integer) tuple.get(0);  if (sal <= 1000) {  return "Grade A";  } else if (sal > 1000 && sal <= 3000) {  return "Grade B";  } else {  return "Grade C";  }  }  
}

继承自EvalFunc< String >。String表示经过运算返回的结果类型
重新exec方法

加载函数(不全)

public class MyLoadFunc extends LoadFunc {  @Override  public InputFormat getInputFormat() throws IOException {  // 返回自定义InputFormat类,或者使用Hadoop的默认输入格式,  // 返回相应的InputFormat类,比如TextInputFormat.class  return null; // 这里只是占位,实际实现中应该返回具体的InputFormat实例  }  @Override  public Tuple getNext() throws IOException {  // 从输入流中读取一行,并解析该行数据  if (reader != null) {  // 假设您的数据是文本格式,每行代表一个Tuple  // 这里只是示例,实际解析可能更复杂  LongWritable key = new LongWritable();  Text value = new Text();  boolean hasNext = reader.nextKeyValue();  if (hasNext) {  key = reader.getCurrentKey();  value = reader.getCurrentValue();  // 根据实际情况解析value,并创建Tuple  // 这里简单地将整行作为一个字符串返回  return TupleFactory.getInstance().newTuple(new Object[]{value.toString()});  }  }  return null; // 如果没有更多数据可读,返回null  }  }  @Override  public void prepareToRead(RecordReader reader, PigSplit split) throws IOException {  // 这个方法在你开始读取数据之前被调用,通常用于初始化一些状态或资源  // PigSplit对象包含了关于数据分割的信息,这可以帮助你确定要读取哪些数据  }  @Override  public void setLocation(String location, Job job) throws IOException {  // 这个方法用于设置输入数据的路径或位置  // 你可以在这里配置Job对象,以便它知道从哪里读取数据  }  
}

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

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

相关文章

CentOS7单机环境安装k8s集群

目录 1、环境准备 2、安装依赖工具 3、配置 Kubernetes 的国内 Yum 源 4. 安装 Kubernetes 组件 5、初始化 Kubernetes 集群 1. 容器运行时没有正常运行 1.1. 可能的原因 1.2. 解决办法 2. 初始化拉取镜像卡住 2.1. 使用国内的镜像源&#xff08;无法解决问题&#x…

AI绘画工具排行榜:探索最受欢迎的AI绘图软件特点与选择指南

AI绘画工具各有优势&#xff0c;从开放性到对特定语言和文化的支持&#xff0c;以及对图像细节和艺术性的不同关注点&#xff0c;根据具体需求选择合适的工具 MidJourney 图片品质卓越&#xff0c;充满独特创意&#xff0c;初期能够免费获取数十账高质量图片&#xff0c;整个生…

ImportError: cannot import name ‘print_log‘ from ‘logging‘

mmcv升级到2.后删除了很多 解决 查FAQ文档&#xff0c;找到 添加到mmcv.utils下即可

海事行政执法证照片要求及尺寸格式修改方法

在海事行政执法领域&#xff0c;证件照片不仅是个人形象的展示&#xff0c;更是专业严谨态度的体现。一张符合规范的照片&#xff0c;不仅能够提升执法人员的权威性&#xff0c;还能在执行任务时获得更多的尊重和信任。本文将为您详细介绍海事行政执法证照片的要求&#xff0c;…

Windows系统安装node.js环境并创建本地服务使用内网穿透发布至公网

目录 前言 1.安装Node.js环境 2.创建node.js服务 3. 访问node.js 服务 4.内网穿透 4.1 安装配置cpolar内网穿透 4.2 创建隧道映射本地端口 5.固定公网地址 前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Windows系统安装node.js环…

网络安全知识科普:什么是网络准入控制系统?有哪些?

在当今数字化时代&#xff0c;网络安全已成为企业和组织不可忽视的重要议题。随着远程工作模式的普及和物联网设备的增加&#xff0c;网络边界越来越模糊&#xff0c;传统防火墙已经不足以应对日益复杂的威胁环境。在这种背景下&#xff0c;网络准入控制系统(Network Access Co…

Redis持久化机制—RDB与AOF

Redis持久化机制 RDB&#xff08;默认&#xff09; **思想&#xff1a;**保存整个数据库的快照&#xff0c;也就是RDB文件&#xff0c;有两种保存方式&#xff0c;前台保存save和后台保存bgsave&#xff0c;前者会阻塞主进程程&#xff0c;后者则是fork一个子进程去完成备份操…

C++入门9——list的使用

目录 1.什么是list&#xff1f; 2.list的构造 3.list迭代器的使用&#xff08;list iterator&#xff09; 4.list capacity 5.list modifiers 6.list的其他操作 1.什么是list&#xff1f; 在官网中&#xff0c;对list有这样的介绍&#xff1a; Lists are sequence co…

SLM561A​​系列 60V 10mA到50mA线性恒流LED驱动芯片 为智能家居照明注入新活力

SLM561A系列选型参考&#xff1a; SLM561A10ae-7G SOD123 SLM561A15ae-7G SOD123 SLM561A20ae-7G SOD123 SLM561A25ae-7G SOD123 SLM561A30ae-7G SOD123 SLM561A35ae-7G SOD123 SLM561A40ae-7G SOD123 SLM561A45ae-7G SOD123 SLM561A50ae-7G SOD123 …

【软件文档】软件系统需求管理规程(项目管理word原件)

软件资料清单列表部分文档清单&#xff1a;工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需求调研计划&#xff0c;用户需求调查单&#xff0c;用户需求说明书&#xff0c;概要设计说明书&#xff0c;技术解…

中秋之美——html5+css+js制作中秋网页

中秋之美——html5cssjs制作中秋网页 一、前言二、功能展示三、系统实现四、其它五、源码下载 一、前言 八月十五&#xff0c;秋已过半&#xff0c;是为中秋。 “但愿人长久&#xff0c;千里共婵娟”&#xff0c;中秋时节&#xff0c;气温已凉未寒&#xff0c;天高气爽&#x…

VS Code 调试go程序的相关配置说明

用 VS code 调试Go程序需要在.vscode/launch.json文件中增加如下配置&#xff1a; // launch.json {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.…

改写二进制文件

以下是一些常见的方法和工具&#xff1a; 1. 使用十六进制编辑器 十六进制编辑器 是最直接的工具之一&#xff0c;用于查看和编辑二进制文件中的数据。它允许你以十六进制格式查看和修改文件内容。 常见十六进制编辑器&#xff1a; HxD&#xff08;Windows&#xff09;Hex F…

【LabVIEW学习篇 - 16】:文件操作

文章目录 CSV文件CSV写入CSV读取 TXT文件txt写入txt读取 INI文件INI文件写入INI文件读取 CSV文件 .csv (Comma-Separated Values&#xff09;是逗号分隔值文件格式&#xff0c;有时也称之为字符分隔值&#xff0c;因为分隔符也可以不是逗号(最常见的是逗号和制表符)&#xff0…

(一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别

🍂1、不说废话,现象展示 🍃图片识别 🍃视频识别 自己训练样本 十分简易快速 opencv级联ha

小皮面板webman ai项目本地启动教程

1.前置条件 下载小皮面板 下载后&#xff0c;双击安装&#xff0c;一路next&#xff08;下一步&#xff09;&#xff0c;无需更改配置。 2.安装必须软件 在小皮面板的软件管理页&#xff0c;安装编号①②③④下面四个软件。 3.启动本地服务 进入到小皮面板的首页&#x…

空指针异常 (NullPointerException)怎么办

在 Java 编程中&#xff0c;空指针异常&#xff08;NullPointerException&#xff0c;简称 NPE&#xff09;是最常见且困扰开发人员的异常之一。尽管 Java 是一种强类型语言&#xff0c;设计上提供了类型安全的特性&#xff0c;但空指针问题依然是开发过程中最常见的运行时异常…

MES系统如何支持企业进行数字化转型

MES系统&#xff08;Manufacturing Execution System&#xff0c;制造执行系统&#xff09;在企业数字化转型中扮演着至关重要的角色&#xff0c;它通过提供实时的生产数据、优化生产流程、提升质量管理水平、实现设备智能化管理以及促进企业内部协同和沟通等多种方式&#xff…

Linux_kernel移植linux09

一、温故知新 1、分析uboot源码目录 每个目录基本上都会有自己的Makefile进行当前层级目录的编译&#xff0c;最后在整个uboot源码目录中会有一个Makefile文件进行整合&#xff0c;将每一层级编译出的目标文件&#xff0c;整合到一起&#xff0c;链接到一起&#xff0c;最终生成…

vscode从本地安装插件

1. 打开VSCode。 2. 点击左侧菜单中的“扩展”&#xff08;或按CtrlShiftX&#xff09;。 3. 点击“更多操作”&#xff08;三个点&#xff09;> “从VSIX安装”。 4. 选择下载的.vsix文件。 5. 点击“安装”即可安装插件。