清管器:无法装入袋子



我有一个格式为的记录

{(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 tuplereject 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访问所有字段。

相关内容

  • 没有找到相关文章

最新更新