无法在 PIG 中转储关系

Posted

技术标签:

【中文标题】无法在 PIG 中转储关系【英文标题】:Unable to dump a relation in PIG 【发布时间】:2016-11-06 09:10:02 【问题描述】:

长期以来一直被困在一个问题上。任何帮助都是不言而喻的。 所以我在 /home/hadoop/pig 目录中有一个数据集文件。我可以查看该文件,因此没有权限问题。 数据集有 4 列,以“::”作为分隔符。 我在 /home/hadoop/pig 目录中以本地模式运行 pig。

ratingsData = LOAD 'ratings.dat' AS (line:chararray);

ratings = FOREACH ratingsData GENERATE FLATTEN(REGEX_EXTRACT_ALL(line,'(.*?)::(.*?)::(.*?)::(.*?)')) AS (uid:int, mid:int, rating:int, timestamp:long);

grouped_mid = GROUP ratings BY mid;

dump grouped_mid;

上述脚本失败。我可以成功转储“ratingsData”和“ratings”关系,但不能转储 grouped_mid。但这是奇怪的部分。下面的脚本运行成功。

ratingsData = LOAD 'ratings.dat' AS (line:chararray);

ratings = FOREACH ratingsData GENERATE FLATTEN(REGEX_EXTRACT_ALL(line,'(.*?)::(.*?)::(.*?)::(.*?)')) AS (uid:int, mid:int, rating:int, timestamp:long);

STORE ratings INTO 'ratingInfo.txt';

X = LOAD 'ratingInfo.txt' AS (uid:int, mid:int, rating:int, timestamp:long);

grouped_mid = GROUP X BY mid;

dump grouped_mid;

显然,第二个脚本有一个多余的步骤。我只是存储一个关系并再次重新加载它。我想避免这种情况。 任何澄清/解释都将是非常可观的。

非常感谢。

【问题讨论】:

我在同一数据集的微型(4 行)大小的样本上进行了尝试。我在 VI 中手动将“::”更改为逗号,并使用 PigStorage 将其加载到关系中,即没有使用 REGEX_EXTRACT_ALL。它运行良好,我可以转储 grouped_mid。 【参考方案1】:

请参考:pig join with java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer

您可以将脚本修改为:

ratingsData = LOAD 'ratings.dat' AS (line:chararray);

ratings = FOREACH ratingsData GENERATE FLATTEN((tuple(int, int, int, long))REGEX_EXTRACT_ALL(line,'(.*?)::(.*?)::(.*?)::(.*?)')) AS (uid:int, mid:int, rating:int, timestamp:long);

grouped_mid = GROUP ratings BY mid;

dump grouped_mid;

经过测试。

【讨论】:

以上是关于无法在 PIG 中转储关系的主要内容,如果未能解决你的问题,请参考以下文章

pig中“无法打开别名的迭代器”是啥意思?

将 xlsx 文件加载到猪关系中

Pig - 无法转储数据

如何使用 apache pig 将标题行加入多个文件中的详细行

使用 Hadoop 配置猪关系

如何在 Hadoop/PIG 中处理非 ASCII/亚洲/中文字符