我有一个格式为的记录
{(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
请提供建议。
它不是一个包,因为它不是由元组组成的。尝试
load ... as (name:tuple(fullname:chararray), age:int, gender:chararray)
出于某种原因,Pig将一行的输出用大括号包裹起来,使其看起来像一个袋子,但事实并非如此。如果使用PigStorage保存了此数据,则可以使用参数('schema')保存该数据,该参数告诉PigStorage创建一个架构文件.pigschema(或类似文件),您可以查看该文件以查看保存的架构是什么。在加载PigStorage时也可以使用该参数来保存AS子句。
LiMuBei
点是绝对正确的。您的输入格式不正确。Pig总是希望袋子里装着collection of tuples
,但在你的情况下是collection of (tuple and fields)
。在这种情况下,在装载过程中,清管器将retain the tuple
和reject the fields
(年龄和性别)。
但这个问题可以用不同的方法很容易地解决(一种巧妙的解决方案)
1.将每个输入行加载为字符数组
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
访问所有字段。