

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Amazon EMR 4.x 上的 Pig 的注意事项
<a name="emr-Pig-4x"></a>

Pig 版本 0.14.0 安装在使用 Amazon EMR 4.x 发行版创建的集群上。Pig 在 Amazon EMR 5.0.0 中已升级到版本 0.16.0。下面介绍了明显差异。

## 不同的默认执行引擎
<a name="emr-Pig-engine-4x"></a>

亚马逊 EMR 4.x 发行版上的 Pig 版本 0.14.0 MapReduce 用作默认执行引擎。Pig 0.16.0 及更高版本均使用 Apache Tez。你可以在`pig-properties`配置分类`exectype=mapreduce`中明确设置要使用 MapReduce。

## 丢弃了 Pig 用户定义的函数 (UDFs)
<a name="emr-Pig-udf-4x"></a>

Pig on Amazon EMR 4.x 发行版本中提供的自定义 UDFs 版本从 Pig 0.16.0 开始被删除。其中大多数 UDFs 都有等效的函数，你可以改用。下表列出了删除的函数 UDFs 和等效函数。有关更多信息，请参阅 Apache Pig 网站上的[内置函数](https://pig.apache.org/docs/r0.16.0/func.html)。


| 已删除的 UDF | 等效函数 | 
| --- | --- | 
|  FORMAT\$1DT(dtformat, date)  |  GetHour（日期）、 GetMinute（日期）、 GetMonth（日期）、 GetSecond（日期）、 GetWeek（日期）、 GetYear（日期）、 GetDay（日期）  | 
|  EXTRACT(string, pattern)  |  REGEX\$1EXTRACT\$1ALL(string, pattern)  | 
|  REPLACE(string, pattern, replacement)  |  REPLACE(string, pattern, replacement)  | 
|  DATE\$1TIME()  |  ToDate()  | 
|  DURATION(dt, dt2)  |  WeeksBetween(dt, dt2), (dt, dt2), YearsBetween (dt, dt2), SecondsBetween (dt, dt2), (dt, dt2), MonthsBetween (dt, dt2), MinutesBetween (dt, dt2) HoursBetween  | 
|  EXTRACT\$1DT(format, date)  |  GetHour（日期）、 GetMinute（日期）、 GetMonth（日期）、 GetSecond（日期）、 GetWeek（日期）、 GetYear（日期）、 GetDay（日期）  | 
|  OFFSET\$1DT(date, duration)  |  AddDuration（日期、持续时间）、 SubtractDuration（日期、持续时间）  | 
|  PERIOD(dt, dt2)  |  WeeksBetween(dt, dt2), (dt, dt2), YearsBetween (dt, dt2), SecondsBetween (dt, dt2), (dt, dt2), MonthsBetween (dt, dt2), MinutesBetween (dt, dt2) HoursBetween  | 
|  CAPITALIZE(string)  |  UCFIRST(string)  | 
|  CONCAT\$1WITH()  |  CONCAT()  | 
|  INDEX\$1OF()  |  INDEXOF()  | 
|  LAST\$1INDEX\$1OF()  |  LAST\$1INDEXOF()  | 
|  SPLIT\$1ON\$1REGEX()  |  STRSPLT()  | 
|  UNCAPITALIZE()  |  LCFIRST()  | 

以下内容 UDFs 被删除但没有等效项：FORMAT ()、LOCAL\$1DATE ()、LOCAL\$1TIME ()、CENTER ()、LEFT\$1PAD ()、REPLET\$1ONCE ()、RIP\$1PAD ()、STRIP\$1END ()、STRIP\$1END ()、STRIP\$1START ()、SWAP\$1CASE ()。

## 已停止使用 Grunt 命令
<a name="emr-pig-gruntcmd-4x"></a>

某些 Grunt 命令已从 Pig 0.16.0 开始停用。下表列出了 Pig 0.14.0 中的 Grunt 命令以及当前版本中的等效命令（如果适用）。


**Pig 0.14.0 和等效的当前 Grunt 命令**  

| Pig 0.14.0 Grunt 命令 | 0.16.0 及更高版本中的 Pig Grunt 命令 | 
| --- | --- | 
|  cat < non-hdfs-path >)  |  fs-cat < non-hdfs-path >;  | 
| cd < non-hdfs-path >; |  无等效函数  | 
| ls < non-hdfs-path >; | fs-ls < non-hdfs-path >; | 
|  移动 < non-hdfs-path > < non-hdfs-path >;  |  fs-mv < non-hdfs-path > < non-hdfs-path >;  | 
| 复制 < non-hdfs-path > < non-hdfs-path >; |  fs-cp < non-hdfs-path > < non-hdfs-path >;  | 
| copyToLocal < non-hdfs-path ><local-path>; |  fs-copyToLocal < non-hdfs-path ><local-path>;  | 
| copyFromLocal <local-path>< non-hdfs-path >; |  fs-copyFromLocal <local-path>< non-hdfs-path >;  | 
| mkdir < non-hdfs-path >; |  fs-mkdir < >; non-hdfs-path   | 
| rm < non-hdfs-path >; |  fs-rm-r-r-skipTrash < >; non-hdfs-path   | 
|  rmf < non-hdfs-path >;  |  fs-rm-r-r-skipTrash < >; non-hdfs-path   | 

## 针对非 HDFS 主目录删除的功能
<a name="emr-Pig-users-4x"></a>

Amazon EMR 4.x 发行版上的 Pig 0.14.0 具有两种机制，以允许无主目录的 `hadoop` 用户之外的用户运行 Pig 脚本。第一种机制是自动后备，将初始工作目录设置为根目录 (如果主目录不存在)。第二种机制是 `pig.initial.fs.name` 属性，它允许您更改初始工作目录。

这两种机制从 Amazon EMR 版本 5.0.0 开始不可用，因此用户必须在 HDFS 上有一个主目录。这不适用于 `hadoop` 用户，因为在启动时会配置一个主目录。使用 Hadoop jar 步骤运行的脚本默认为由 Hadoop 用户运行，除非使用 `command-runner.jar` 显式指定了其它用户。