猪:无法加载BAG

时间:2015-02-04 14:43:21

标签: hadoop mapreduce apache-pig bigdata

我有这种格式的记录:

{(Larry Page),23,M}
{(Suman Dey),22,M}
{(Palani Pratap),25,M}

我正在尝试使用此LOAD记录:

records = LOAD '~/Documents/PigBag.txt' AS (details:BAG{name:tuple(fullname:chararray),age:int,gender:chararray});

但是我收到了这个错误:

2015-02-04 20:09:41,556 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: <line 7, column 101>  mismatched input ',' expecting RIGHT_CURLY

请建议。

2 个答案:

答案 0 :(得分:1)

它不是一个包,因为它不是由元组组成的。尝试

load ... as (name:tuple(fullname:chararray), age:int, gender:chararray)

由于某种原因,Pig用花括号包裹一条线的输出,使它看起来像一个包,但事实并非如此。如果您使用PigStorage保存了这些数据,则可以使用参数('-schema')保存它,该参数告诉PigStorage创建一个模式文件.pigschema(或类似的东西),您可以查看它以查看保存的模式是什么。它也可以在使用PigStorage加载时使用,以保存AS子句。

答案 1 :(得分:1)

LiMuBei点是绝对正确的。您的输入格式不正确。 Pig总是希望这个包应该保持collection of tuples,但在你的情况下,它应该是collection of (tuple and fields)。在这种情况下,猪在加载过程中会retain the tuplereject the fields(年龄和性别)。

但是这个问题可以通过不同的方法(一种hacky解决方案)轻松解决 1.将每个输入行加载为chararray 2.从输入中删除花括号和功能括号 3.使用strsplit函数将输入分隔为(名称,年龄,性别)字段。

<强> PigScript:

A = LOAD 'input' USING PigStorage AS (line:chararray);
B = FOREACH A GENERATE FLATTEN(REPLACE(line,'[}{)(]+','')) AS (newline:chararray);
C = FOREACH B GENERATE FLATTEN(STRSPLIT(newline,',',3)) AS (fullname:chararray,age:int,sex:chararray);
DUMP C;

<强>输出:

(Larry Page,23,M)
(Suman Dey,22,M)
(Palani Pratap,25,M)

现在,您可以使用fullname,age,sex访问所有字段。