使用 Amazon EMR 4.x 上的 Pig 的注意事项 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Amazon EMR 4.x 上的 Pig 的注意事项

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

不同的默认执行引擎

Amazon EMR 4.x 发行版上的 Pig 版本 0.14.0 使用 MapReduce 作为默认执行引擎。Pig 0.16.0 及更高版本均使用 Apache Tez。您可在 exectype=mapreduce 配置分类中显式设置 pig-properties 以使用 MapReduce。

已删除的 Pig 用户定义函数(UDF)

从 Pig 0.16.0 开始,删除了在 Amazon EMR 4.x 发行版上的 Pig 中可用的自定义 UDF。大多数 UDF 具有您可替换的等效函数。下表列出了已删除的 UDF 和等效函数。有关更多信息,请参阅 Apache Pig 网站上的内置函数

已删除的 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 命令

某些 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 主目录删除的功能

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 显式指定了其它用户。