无法在 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 中转储关系的主要内容,如果未能解决你的问题,请参考以下文章