

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 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>

Amazon EMR 4.x 發行版本上的 Pig 版本 0.14.0 使用 MapReduce 作為預設執行引擎。Pig 0.16.0 和更新版本使用 Apache Tez。您可以在 `exectype=mapreduce` 組態分類中明確設定 `pig-properties` 以使用 MapReduce。

## 捨棄 Pig 使用者定義函數 (UDF)
<a name="emr-Pig-udf-4x"></a>

Amazon EMR 4.x 發行版本上的 Pig 中提供的自訂 UDF 從 Pig 0.16.0 開始捨棄。大部分的 UDF 都有您可以改用的功能。下表列出捨棄的 UDF 和同等函數。如需詳細資訊，請參閱 Apache Pig 網站上的[內建函數](https://pig.apache.org/docs/r0.16.0/func.html)。


| 捨棄的 UDF | 同等函數 | 
| --- | --- | 
| FORMAT\_DT(dtformat, date) | GetHour(date)、GetMinute(date)、GetMonth(date)、GetSecond(date)、GetWeek(date)、GetYear(date)、GetDay(date) | 
| EXTRACT(string, pattern) | REGEX\_EXTRACT\_ALL(string, pattern) | 
| REPLACE(string, pattern, replacement) | REPLACE(string, pattern, replacement) | 
| DATE\_TIME() | ToDate() | 
| DURATION(dt, dt2) | WeeksBetween(dt, dt2)、YearsBetween(dt, dt2)、SecondsBetween(dt, dt2)、MonthsBetween(dt, dt2)、MinutesBetween(dt, dt2)、HoursBetween(dt, dt2) | 
| EXTRACT\_DT(format, date) | GetHour(date)、GetMinute(date)、GetMonth(date)、GetSecond(date)、GetWeek(date)、GetYear(date)、GetDay(date) | 
| OFFSET\_DT(date, duration) | AddDuration(date, duration)、SubtractDuration(date, duration) | 
| PERIOD(dt, dt2) | WeeksBetween(dt, dt2)、YearsBetween(dt, dt2)、SecondsBetween(dt, dt2)、MonthsBetween(dt, dt2)、MinutesBetween(dt, dt2)、HoursBetween(dt, dt2) | 
| CAPITALIZE(string) | UCFIRST(string) | 
| CONCAT\_WITH() | CONCAT() | 
| INDEX\_OF() | INDEXOF() | 
| LAST\_INDEX\_OF() | LAST\_INDEXOF() | 
| SPLIT\_ON\_REGEX() | STRSPLT() | 
| UNCAPITALIZE() | LCFIRST() | 

以下捨棄的 UDF 並無同等函數：FORMAT()、LOCAL\_DATE()、LOCAL\_TIME()、CENTER()、LEFT\_PAD()、REPEAT()、REPLACE\_ONCE()、RIGHT\_PAD()、STRIP()、STRIP\_END()、STRIP\_START()、SWAP\_CASE()。

## 停止使用的 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>; | 
| move <non-hdfs-path> <non-hdfs-path>; | fs -mv <non-hdfs-path> <non-hdfs-path>; | 
| copy <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 -skipTrash <non-hdfs-path>; | 
| rmf <non-hdfs-path>; | fs -rm -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` 明確指定另一位使用者。