当前位置: 首页 > news >正文

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对象,以便它知道从哪里读取数据  }  
}

相关文章:

Apache Pig

目录 一、配置说明1.本地模式2.集群模式 二、pig的数据模型三、pig的数据类型四、惰性执行五、pig的基本语法5.1语法说明5.2案例操作 六、pig的自定义函数 一、配置说明 1.本地模式 操作的是Linux系统文件 pig -x local关键日志 当前处于root目录下 2.集群模式 连接的是…...

axios返回的是promise对象如何处理?

axios返回的是promise对象如何处理&#xff1f; Axios返回的是Promise对象&#xff0c;这意味着可以使用Promise的.then()、.catch()和.finally()方法来处理异步操作的结果。 以下是处理Axios返回Promise对象的几种常见方式&#xff1a; 1、使用.then()处理响应数据&#xf…...

归并排序/计数排序

1&#xff1a;归并排序 1.1&#xff1a;代码 void _MergeSort(int* arr, int left, int right, int* tmp) {if (left > right){return;}int mid (left right) / 2; _MergeSort(arr, left, mid, tmp); _MergeSort(arr, mid1, right, tmp); int begin1 left…...

etcdctl defrag 剔除、添加etcd节点

零、准备工作 find / -name etcdctl cp /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/12/fs/usr/local/bin/etcdctl /usr/local/bin/etcdctlalias ec"etcdctl --endpointshttps://127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --…...

计算机网络(二) —— 网络编程套接字

目录 一&#xff0c;认识端口号 1.1 背景 1.2 端口号是什么 1.3 三个问题 二&#xff0c;认识Tcp协议和Udp协议 三&#xff0c;网络字节序 四&#xff0c;socket编程接口 4.1 socket常见API 4.2 sockaddr结构 一&#xff0c;认识端口号 1.1 背景 问题&#xff1a;在进…...

二百五十九、Java——采集Kafka数据,解析成一条条数据,写入另一Kafka中(一般JSON)

一、目的 由于部分数据类型频率为1s&#xff0c;从而数据规模特别大&#xff0c;因此完整的JSON放在Hive中解析起来&#xff0c;尤其是在单机环境下&#xff0c;效率特别慢&#xff0c;无法满足业务需求。 而Flume的拦截器并不能很好的转换数据&#xff0c;因为只能采用Java方…...

Qt项目使用Inno Setup打包(关于打包中文乱码的解决)

​ 关于打包好的文件乱码解决方法 打包好的文件中文乱码&#xff0c;就是编码格式出现了问题&#xff0c;更改一下中文脚本编码格式&#xff0c;在官网Inno Setup Translations下载好中文脚本 点击下载&#xff0c;然后另存为 得到ChineseSimplified.isl.txt文件后&#…...

HTML和HTML5有什么区别

HTML&#xff08;超文本标记语言&#xff09;是构建网页的基础&#xff0c;而HTML5是HTML的最新版本。虽然HTML和HTML5在许多方面相似&#xff0c;但HTML5引入了许多新的特性和改进&#xff0c;使得网页开发更加高效和功能丰富。 一、HTML概述 HTML&#xff0c;即超文本标记语…...

Collections

Collections 是 Java 中的一个实用工具类&#xff0c;提供了一系列静态方法来操作集合。以下是其详细介绍&#xff1a; 前置知识 在 Java 中&#xff0c;可变参数&#xff08;Varargs&#xff09;允许方法接受可变数量的参数。使用可变参数时&#xff0c;可以传递任意数量的参…...

fastreport打印trichedit分页问题的解决

用fastreport来打印richedit里面的内容。刚开始放一个frxrichview组件到报表上&#xff0c;然后在 var str: TMemoryStream; begin begin str: TMemoryStream.Create; CurrRichRecord.richedit.Lines.SaveToStream(str); str.Position: 0; tfrxRichview(fr…...

【MeterSphere】vnc连接不上selenium-chrome容器

目录 一、现象 二、查看配置文件 docker-compose-seleniarm.yml 三、处理 3.1 删除上图当中的三行 3.2 msctl reload 3.3 重新连接 前言&#xff1a;使用vnc连不上ms的selenium-chrome容器&#xff0c;看不到里面运行情况&#xff0c;以前其实可以&#xff0c;后来不行…...

mysql explain分析

目录 思维导图 id select_type SIMPLE PRIMARY SUBQUERY DEPENDENT SUBQUREY UNCACHEABLE SUBQUREY&#xff1a; UNION UNION RESULT DERIVED MATERIALIZED table partitions type ALL index range ref eq_ref const system possible_keys keys key_l…...

[论文笔记]Circle Loss: A Unified Perspective of Pair Similarity Optimization

引言 为了理解CoSENT的loss,今天来读一下Circle Loss: A Unified Perspective of Pair Similarity Optimization。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 这篇论文从对深度特征学习的成对相似度优化角度出发,旨在最大化同类之间…...

Windows .NET8 实现 远程一键部署,几秒完成发布,提高效率 - CICD

1. 前言 场景 &#xff08;工作环境 一键部署 到 远端服务器 [阿里云]&#xff09; CICD 基本步骤回顾 https://blog.csdn.net/CsethCRM/article/details/141604638 2. 环境准备 服务器端IP&#xff1a;106.15.74.25&#xff08;阿里云服务器&#xff09; 客户端&#xff1…...

echarts 水平柱图 科技风

var category [{ name: "管控", value: 2500 }, { name: "集中式", value: 8000 }, { name: "纳管", value: 3000 }, { name: "纳管", value: 3000 }, { name: "纳管", value: 3000 } ]; // 类别 var total 10000; // 数据…...

标准IO与系统IO

概念区别 标准IO&#xff1a;&#xff08;libc提供&#xff09; fopen fread fwrite 系统IO&#xff1a;&#xff08;linux系统提供&#xff09; open read write 操作效率 因为内存与磁盘的执行效率不同 系统IO&#xff1a; 把数据从内存直接写到磁盘上 标准IO&#xff…...

【conda】Conda 环境迁移指南:如何更改 envs_dirs 和 pkgs_dirs 以及跨盘迁移

目录 迁移概述一、conda 配置文件1.1 安装 Conda 后的默认目录设置1.2 查看当前 .condarc 配置 二、更改 Conda 的 envs_dirs 和 pkgs_dirs 设置2.1 使用 conda config 命令Windows 和 Linux 系统 2.2 手动编辑 .condarc 文件Windows 系统Linux 系统 2.3 验证设置 三、迁移 Con…...

脏页写入磁盘的过程详解

脏页写入磁盘的过程 一、引言 在数据库系统中,脏页是指那些被修改过但还未写入磁盘的数据页。为了保证数据的一致性和持久性,数据库系统需要在适当的时候将脏页写入磁盘。了解脏页写入磁盘的过程对于理解数据库的内部工作机制和优化性能至关重要。 二、触发脏页写入的条件…...

数据结构——单链表实现和注释浅解

关于单链表的基础部分增删查改的实现和一点理解&#xff0c;写在注释里~ SList.h #pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h>//定义节点的结构 //数据 指向下一个节点的指针 typedef int SLTDataType;typedef struct SListNo…...

滑动窗口系列(同向双指针)/9.7

新的解题思路 一、三数之和的多种可能 给定一个整数数组 arr &#xff0c;以及一个整数 target 作为目标值&#xff0c;返回满足 i < j < k 且 arr[i] arr[j] arr[k] target 的元组 i, j, k 的数量。 由于结果会非常大&#xff0c;请返回 109 7 的模。 输入&…...

苏州创新药20年,站上全球产业洗牌暴风眼

一个城市的创新药产业集群如何从无到有&#xff0c;又如何在全球化临界点寻找自己的位置。文&#xff5c;徐鑫编&#xff5c;任晓渔过去一年多&#xff0c;苏州是全球创新药产业版图中一个绕不过去的城市。大额海外授权交易频繁传出&#xff0c;在中国高端制造走出去的背景下&a…...

如何快速上手DeepPurpose?5分钟完成你的第一个药物-靶点相互作用预测模型

如何快速上手DeepPurpose&#xff1f;5分钟完成你的第一个药物-靶点相互作用预测模型 【免费下载链接】DeepPurpose A Deep Learning Toolkit for DTI, Drug Property, PPI, DDI, Protein Function Prediction (Bioinformatics) 项目地址: https://gitcode.com/gh_mirrors/de…...

开源ELM327 OBD-II适配器:从硬件设计到多协议固件实现全解析

1. 项目概述&#xff1a;开源ELM327 OBD适配器如果你对汽车诊断、数据监控或者嵌入式开发感兴趣&#xff0c;那么自己动手做一个OBD-II适配器绝对是个能让你学到很多东西的硬核项目。今天要聊的&#xff0c;就是一个完全开源的、基于NXP LPC1517微控制器的ELM327兼容OBD适配器。…...

Ubuntu经常安装软件

1、垃圾清理工具stacer sudo apt updatesudo apt install stacer apt cleanapt autocleanapt autoremove 2、类似与everything的工具Fsearcch 1sudo add-apt-repository ppa:christian-boxdoerfer/fsearch-stable 2sudo apt update 3sudo apt install fsearch (注&#xf…...

自然语言处理的实战项目:从0到1搭建属于自己的文本分类系统

对于软件测试从业者而言&#xff0c;日常工作中我们每天都会接触大量的文本数据&#xff1a;缺陷管理系统中的bug描述、测试用例的步骤说明、用户反馈的问题报告、需求文档的规格描述&#xff0c;甚至是接口返回的异常信息文本。这些非结构化文本往往隐含着关键业务信息&#x…...

解锁你的音乐收藏:浏览器端音频解密完整指南

解锁你的音乐收藏&#xff1a;浏览器端音频解密完整指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https://gitcod…...

DeepSeek注释质量跃迁路径(附12个真实项目对比数据+可复用Prompt模板)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;DeepSeek注释质量跃迁路径&#xff08;附12个真实项目对比数据可复用Prompt模板&#xff09; 高质量代码注释不再是“锦上添花”&#xff0c;而是模型理解意图、团队高效协同与长期可维护性的核心基础设施。…...

动物森友会岛屿设计终极指南:用Happy Island Designer打造梦想岛屿

动物森友会岛屿设计终极指南&#xff1a;用Happy Island Designer打造梦想岛屿 【免费下载链接】HappyIslandDesigner "Happy Island Designer (Alpha)"&#xff0c;是一个在线工具&#xff0c;它允许用户设计和定制自己的岛屿。这个工具是受游戏《动物森友会》(Anim…...

后端开发者体验 AI 前端:用 TinyVue 做一个智能业务表单 Demo

摘要 作为 Java 后端开发者&#xff0c;我平时更多关注接口、SQL 和业务逻辑&#xff0c;但后台系统里也绕不开表单、列表和报表页面。本文结合 OpenTiny NEXT 学习体验&#xff0c;用 TinyVue 做一个智能业务表单 Demo&#xff0c;聊聊 AI 前端对后端开发者到底有没有实际帮助…...

德国、奥地利和瑞士 SaaS 市场销售策略大揭秘:风险优先,节奏放慢!

1. 嵌入工作流介绍嵌入工作流有其官网主页&#xff0c;具备多种功能&#xff0c;如 ChatGPT 集成、专家支持、无需编码、白标、集成等&#xff1b;还有多种解决方案&#xff0c;包括代理商、CRM、iPaaS 替代方案、物业管理、房地产、初创企业、WordPress 插件、增加收入等&…...