我有这种格式的记录:
{(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
请建议。
答案 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 tuple
和reject 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
访问所有字段。