什么是Apache Pig?

Apache Pig是MapReduce的一个抽象。它是一个工具/平台,用于分析较大的数据集,并将它们表示为数据流。Pig通常与 Hadoop 一起使用;我们可以使用Apache Pig在Hadoop中执行所有的数据处理操作。

要编写数据分析程序,Pig提供了一种称为 Pig Latin 的高级语言。该语言提供了各种操作符,程序员可以利用它们开发自己的用于读取,写入和处理数据的功能。

要使用 Apache Pig 分析数据,程序员需要使用Pig Latin语言编写脚本。所有这些脚本都在内部转换为Map和Reduce任务。Apache Pig有一个名为 Pig Engine 的组件,它接受Pig Latin脚本作为输入,并将这些脚本转换为MapReduce作业。

为什么我们需要Apache Pig?

不太擅长Java的程序员通常习惯于使用Hadoop,特别是在执行任一MapReduce作业时。Apache Pig是所有这样的程序员的福音。

  • 使用 Pig Latin ,程序员可以轻松地执行MapReduce作业,而无需在Java中键入复杂的代码。
  • Apache Pig使用多查询方法,从而减少代码长度。例如,需要在Java中输入200行代码(LoC)的操作在Apache Pig中输入少到10个LoC就能轻松完成。最终,Apache Pig将开发时间减少了近16倍。
  • Pig Latin是类似SQL的语言,当你熟悉SQL后,很容易学习Apache Pig。
  • Apache Pig提供了许多内置操作符来支持数据操作,如join,filter,ordering等。此外,它还提供嵌套数据类型,例如tuple(元组),bag(包)和MapReduce缺少的map(映射)。

Apache Pig的特点

Apache Pig具有以下特点:

  • 丰富的运算符集 - 它提供了许多运算符来执行诸如join,sort,filer等操作。
  • 易于编程 - Pig Latin与SQL类似,如果你善于使用SQL,则很容易编写Pig脚本。
  • 优化机会 - Apache Pig中的任务自动优化其执行,因此程序员只需要关注语言的语义。
  • 可扩展性 - 使用现有的操作符,用户可以开发自己的功能来读取、处理和写入数据。
  • 用户定义函数 - Pig提供了在其他编程语言(如Java)中创建用户定义函数的功能,并且可以调用或嵌入到Pig脚本中。
  • 处理各种数据 - Apache Pig分析各种数据,无论是结构化还是非结构化,它将结果存储在HDFS中。

Apache Pig与MapReduce

下面列出的是Apache Pig和MapReduce之间的主要区别。

Apache Pig

MapReduce

Apache Pig是一种数据流语言。

MapReduce是一种数据处理模式。

它是一种高级语言。

MapReduce是低级和刚性的。

在Apache Pig中执行Join操作非常简单。

在MapReduce中执行数据集之间的Join操作是非常困难的。

任何具备SQL基础知识的新手程序员都可以方便地使用Apache Pig工作。

向Java公开是必须使用MapReduce。

Apache Pig使用多查询方法,从而在很大程度上减少代码的长度。

MapReduce将需要几乎20倍的行数来执行相同的任务。

没有必要编译。执行时,每个Apache Pig操作符都在内部转换为MapReduce作业。

MapReduce作业具有很长的编译过程。

Apache Pig Vs SQL

下面列出了Apache Pig和SQL之间的主要区别。

Pig

SQL

Pig Latin是一种程序语言。

SQL是一种声明式语言。

在Apache Pig中,模式是可选的。我们可以存储数据而无需设计模式(值存储为$ 01,$ 02等)

模式在SQL中是必需的。

Apache Pig中的数据模型是嵌套关系

SQL 中使用的数据模型是平面关系

Apache Pig为查询优化提供有限的机会。

在SQL中有更多的机会进行查询优化。

除了上面的区别,Apache Pig Latin:

  • 允许在pipeline(流水线)中拆分。
  • 允许开发人员在pipeline中的任何位置存储数据。
  • 声明执行计划。
  • 提供运算符来执行ETL(Extract提取,Transform转换和Load加载)功能。

Apache Pig VS Hive

Apache Pig和Hive都用于创建MapReduce作业。在某些情况下,Hive以与Apache Pig类似的方式在HDFS上运行。在下表中,我们列出了几个重要的点区分Apache Pig与Hive。

Apache Pig

Hive

Apache Pig使用一种名为 Pig Latin 的语言(最初创建于 Yahoo )。

Hive使用一种名为 HiveQL 的语言(最初创建于 Facebook )。

Pig Latin是一种数据流语言。

HiveQL是一种查询处理语言。

Pig Latin是一个过程语言,它适合流水线范式。

HiveQL是一种声明性语言。

Apache Pig可以处理结构化,非结构化和半结构化数据。

Hive主要用于结构化数据。

Apache Pig的应用程序

Apache Pig通常被数据科学家用于执行涉及特定处理和快速原型设计的任务。使用Apache Pig:

  • 处理巨大的数据源,如Web日志。
  • 为搜索平台执行数据处理。
  • 处理时间敏感数据的加载。

Apache Pig 架构

用于使用Pig分析Hadoop中的数据的语言称为 Pig Latin ,是一种高级数据处理语言,它提供了一组丰富的数据类型和操作符来对数据执行各种操作。

要执行特定任务时,程序员使用Pig,需要用Pig Latin语言编写Pig脚本,并使用任何执行机制(Grunt Shell,UDFs,Embedded)执行它们。执行后,这些脚本将通过应用Pig框架的一系列转换来生成所需的输出。

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

apache opennlp 中文 apachepig_apache opennlp 中文

Apache Pig组件

如图所示,Apache Pig框架中有各种组件。让我们来看看主要的组件。

Parser(解析器)

最初,Pig脚本由解析器处理,它检查脚本的语法,类型检查和其他杂项检查。解析器的输出将是DAG(有向无环图),它表示Pig Latin语句和逻辑运算符。在DAG中,脚本的逻辑运算符表示为节点,数据流表示为边。

Optimizer(优化器)

逻辑计划(DAG)传递到逻辑优化器,逻辑优化器执行逻辑优化,例如投影和下推。

Compiler(编译器)

编译器将优化的逻辑计划编译为一系列MapReduce作业。

Execution engine(执行引擎)

最后,MapReduce作业以排序顺序提交到Hadoop。这些MapReduce作业在Hadoop上执行,产生所需的结果。

Pig Latin数据模型

Pig Latin的数据模型是完全嵌套的,它允许复杂的非原子数据类型,例如 map  tuple 。下面给出了Pig Latin数据模型的图形表示。

apache opennlp 中文 apachepig_Pig_02

Atom(原子)

Pig Latin中的任何单个值,无论其数据类型,都称为 Atom 。它存储为字符串,可以用作字符串和数字。int,long,float,double,chararray和bytearray是Pig的原子值。一条数据或一个简单的原子值被称为字段:“raja“或“30"

Tuple(元组)

由有序字段集合形成的记录称为元组,字段可以是任何类型。元组与RDBMS表中的行类似。例:(Raja,30)

Bag(包)

一个包是一组无序的元组。换句话说,元组(非唯一)的集合被称为包。每个元组可以有任意数量的字段(灵活模式)。包由“{}"表示。它类似于RDBMS中的表,但是与RDBMS中的表不同,不需要每个元组包含相同数量的字段,或者相同位置(列)中的字段具有相同类型。

:{(Raja,30),(Mohammad,45)}

包可以是关系中的字段;在这种情况下,它被称为内包(inner bag)

:{Raja,30, {9848022338,raja@gmail.com,} }

Map(映射)

映射(或数据映射)是一组key-value对。key需要是chararray类型,且应该是唯一的。value可以是任何类型,它由“[]"表示,

:[name#Raja,age#30]

Relation(关系)

一个关系是一个元组的包。Pig Latin中的关系是无序的(不能保证按任何特定顺序处理元组)。

Apache Pig 执行

在上一章中,我们解释了如何安装Apache Pig。在本章中,我们将讨论如何执行Apache Pig。

Apache Pig执行模式

你可以以两种模式运行Apache Pig,即Local(本地)模式HDFS模式

Local模式

在此模式下,所有文件都从本地主机和本地文件系统安装和运行,不需要Hadoop或HDFS。此模式通常用于测试目的。

MapReduce模式

MapReduce模式是我们使用Apache Pig加载或处理Hadoop文件系统(HDFS)中存在的数据的地方。在这种模式下,每当我们执行Pig Latin语句来处理数据时,会在后端调用一个MapReduce作业,以对HDFS中存在的数据执行特定的操作。

Apache Pig执行机制

Apache Pig脚本可以通过三种方式执行,即交互模式,批处理模式和嵌入式模式。

  • 交互模式(Grunt shell) - 你可以使用Grunt shell以交互模式运行Apache Pig。在此shell中,你可以输入Pig Latin语句并获取输出(使用Dump运算符)。
  • 批处理模式(脚本) - 你可以通过将Pig Latin脚本写入具有 .pig 扩展名的单个文件中,以批处理模式运行Apache Pig。
  • 嵌入式模式(UDF) - Apache Pig允许在Java等编程语言中定义我们自己的函数(UDF用户定义函数),并在我们的脚本中使用它们。

调用Grunt Shell

你可以使用“-x"选项以所需的模式(local/MapReduce)调用Grunt shell,如下所示。

Local模式

MapReduce模式

Command(命令) -

$ ./pig -x local

Command(命令)-

$ ./pig -x mapreduce

Output(输出) -

apache opennlp 中文 apachepig_apache opennlp 中文_03

Output(输出)-

apache opennlp 中文 apachepig_Apache_04

这两个命令都给出了Grunt shell提示符,如下所示。

grunt>

你可以使用“ctrl+d"退出Grunt shell。

在调用Grunt shell之后,可以通过直接输入Pig中的Pig Latin语句来执行Pig脚本。

grunt> customers = LOAD 'customers.txt' USING PigStorage(',');

在批处理模式下执行Apache Pig

你可以在文件中编写整个Pig Latin脚本,并使用 -x command 执行它。我们假设在一个名为 sample_script.pig 的文件中有一个Pig脚本,如下所示。

Sample_script.pig

student = LOAD 'hdfs://localhost:9000/pig_data/student.txt' USING
   PigStorage(',') as (id:int,name:chararray,city:chararray);
  
Dump student;

现在,你可以在上面的文件中执行脚本,如下所示。

Local模式

MapReduce模式

$ pig -x local Sample_script.pig

$ pig -x mapreduce Sample_script.pig

注意:我们将详细讨论如何在批处理模式嵌入模式中运行Pig脚本。

Pig Latin 基础

Pig Latin是用于使用Apache Pig分析Hadoop中数据的语言。在本章中,我们将讨论Pig Latin的基础知识,如Pig Latin语句,数据类型,通用运算符,关系运算符和Pig Latin UDF。

Pig Latin - 数据模型

如前面章节所讨论的,Pig的数据模型是完全嵌套的。Relation是Pig Latin数据模型的最外层结构。它是一个其中:

  • 包是元组的集合。
  • 元组是有序的字段集。
  • 字段是一段数据。

Pig Latin - 语句

在使用Pig Latin处理数据时,语句是基本结构。

  • 这些语句使用关系(relation),它们包括表达式(expression)模式(schema)
  • 每个语句以分号(;)结尾。
  • 我们将使用Pig Latin提供的运算符通过语句执行各种操作。
  • 除了LOAD和STORE,在执行所有其他操作时,Pig Latin语句采用关系作为输入,并产生另一个关系作为输出。
  • 只要在Grunt shell中输入 Load 语句,就会执行语义检查。要查看模式的内容,需要使用 Dump 运算符。只有在执行 dump 操作后,才会执行将数据加载到文件系统的MapReduce作业。

例子

下面给出一个Pig Latin语句,它将数据加载到Apache Pig中。

grunt> Student_data = LOAD 'student_data.txt' USING PigStorage(',')as 
   ( id:int, firstname:chararray, lastname:chararray, phone:chararray, city:chararray );

Pig Latin - 数据类型

下面给出的表描述了Pig Latin数据类型。

序号

数据类型

说明&示例

1

int

表示有符号的32位整数。

示例:8

2

long

表示有符号的64位整数。

示例:5L

3

float

表示有符号的32位浮点。

示例:5.5F

4

double

表示64位浮点。

示例:10.5

5

chararray

表示Unicode UTF-8格式的字符数组(字符串)。

示例:‘w3cschool’

6

Bytearray

表示字节数组(blob)。

7

Boolean

表示布尔值。

示例:true / false。

8

Datetime

表示日期时间。

示例:1970-01-01T00:00:00.000 + 00:00

9

Biginteger

表示Java BigInteger。

示例:60708090709

10

Bigdecimal

表示Java BigDecimal

示例:185.98376256272893883

复杂类型

11

Tuple

元组是有序的字段集。

示例:(raja,30)

12

Bag

包是元组的集合。

示例:{(raju,30),(Mohhammad,45)}

13

Map

地图是一组键值对。

示例:['name'#'Raju','age'#30]

Null值

所有上述数据类型的值可以为NULL。Apache Pig以与SQL类似的方式处理空值。null可以是未知值或不存在值,它用作可选值的占位符。这些空值可以自然出现或者可以是操作的结果。

Pig Latin - 算术运算符

下表描述了Pig Latin的算术运算符。假设a = 10和b = 20。

运算符

描述

示例

+

 - 运算符的两侧的值相加

a+b将得出30


 - 从运算符左边的数中减去右边的数

a-b将得出-10

*

 - 运算符两侧的值相乘

a*b将得出200

/

 - 用运算符左边的数除右边的数

b / a将得出2

%

系数 - 用运算符右边的数除左边的数并返回余数

b%a将得出0

? :

Bincond - 评估布尔运算符。它有三个操作数,如下所示。

变量 x =(expression)? value1 (如果为true): value2(如果为false)。

b =(a == 1)? 20:30;

如果a = 1,则b的值为20。

如果a!= 1,则b的值为30。

CASE

WHEN

THEN

ELSE

END

Case - case运算符等效于嵌套的bincond运算符。

CASE f2 % 2

WHEN  0

THEN

'even'

 

WHEN  1

THEN

'odd'

END

Pig Latin - 比较运算符

下表描述了Pig Latin的比较运算符。

运算符

描述

示例

==

等于 - 检查两个数的值是否相等;如果是,则条件变为true。

(a = b)不为true。

!=

不等于 - 检查两个数的值是否相等。如果值不相等,则条件为true。

(a!= b)为true。

>

大于 - 检查左边数的值是否大于右边数的值。 如果是,则条件变为true。

(a> b)不为true。

<

小于 - 检查左边数的值是否小于右边数的值。 如果是,则条件变为true。

(a<b)为true。

>=

大于或等于 - 检查左边数的值是否大于或等于右边数的值。如果是,则条件变为true。

(a>=b)不为true。

<=

小于或等于 - 检查左边数的值是否小于或等于右边数的值。如果是,则条件变为true。

(a<=b)为true。

matches

模式匹配 - 检查左侧的字符串是否与右侧的常量匹配。

f1 matches '.* tutorial.*'

Pig Latin - 类型结构运算符

下表描述了Pig Latin的类型结构运算符。

运算符

描述

示例

()

元组构造函数运算符 - 此运算符用于构建元组。

(Raju,30)

{}

包构造函数运算符 - 此运算符用于构造包。

{(Raju,30),(Mohammad,45)}

[]

映射构造函数运算符 - 此运算符用于构造一个映射。

[name#Raja,age#30]

Pig Latin - 关系运算符

下表描述了Pig Latin的关系运算符。

运算符

描述

加载和存储

LOAD

将数据从文件系统(local/ HDFS)加载到关系中。

STORE

将数据从文件系统(local/ HDFS)存储到关系中。

过滤

FILTER

从关系中删除不需要的行。

DISTINCT

从关系中删除重复行。

FOREACH,GENERATE

基于数据列生成数据转换。

STREAM

使用外部程序转换关系。

分组和连接

JOIN

连接两个或多个关系。

COGROUP

将数据分组为两个或多个关系。

GROUP

在单个关系中对数据进行分组。

CROSS

创建两个或多个关系的向量积。

排序

ORDER

基于一个或多个字段(升序或降序)按排序排列关系。

LIMIT

从关系中获取有限数量的元组。

合并和拆分

UNION

将两个或多个关系合并为单个关系。

SPLIT

将单个关系拆分为两个或多个关系。

诊断运算符

DUMP

在控制台上打印关系的内容。

DESCRIBE

描述关系的模式。

EXPLAIN

查看逻辑,物理或MapReduce执行计划以计算关系。

ILLUSTRATE

查看一系列语句的分步执行。